微信小程序 本地数据存储实例详解


Posted in Javascript onApril 13, 2017

微信小程序 本地数据存储实例详解

前言

如果您在看此文章之前有过其他程序的开发经验,那一定会知道一般例如安卓或者苹果的原生APP都提供了本地的存储功能,甚至可以使用sqlite数据库来做存储。可是微信的小程序框架基于微信本身,其实际运行环境只是在浏览器里面,所以不会提供那么丰富的数据存储实力。但html5开始已经可以在浏览器里面存储数据,好在微信的小程序给这个功能封装好了,这样我们可以使用数据存储。

每个微信小程序都可以有自己的本地缓存,可以通过 wx.setStorage(wx.setStorageSync)

wx.getStorage(wx.getStorageSync)、 
wx.clearStorage(wx.clearStorageSync)

可以对本地缓存进行设置、获取和清理。本地缓存最大为10MB。

上面的set和get都有对应的Sync方法,带Sync的方法为同步方法、不带Sync的方法为异步方法。

设置缓存都需要设置一个key和对应的data值,我们在《微信web开发者工具》中的调试状态下可以点击调试窗口的Storage 栏来查看我们缓存在本地的数据。

缓存可以保存数组、数值、字符串、对象。

设置缓存

提供setStorage和setStorageSync两个接口,并且在使用设置存储方法时,如果小程序的存储值当中已经存在对应的key的值,那么会使用新的值替换原来的值。

setSotrage接口

wx.setStorage({
 key:"key",
 data:"value",
 success:function(res){console.log(res)},
 fail:function(res){console.log(res)},
 complete:function(res){console.log(res)},
})
//Object {errMsg: "setStorage:ok"}
//Object {errMsg: "setStorage:ok"}

setStorageSync接口

因为该方法为同步接口,所以直接设置key和data:

wx.setStorageSync('key', 'value')

上面两个demo中我们都使用了字符串缓存,当然我们也可以缓存一个对象,例如:

wx.setStorage({key:"ob",data:{name:'smallerpig',sex:1,age:18}})

获取缓存

getSotrage接口

异步接口,所以我们可以定义几个回调:

wx.getStorage(
{
 key:'key',
 success:function(res){
  console.log(res)//Object {errMsg: "getStorage:ok", data: "value1"}
 },
 fail:function(res){console.log(res)},
 complete:function(res){console.log(res)}
})

其中,我们可以看出来,微信小程序的很多异步接口的回调都会给出三个回调:success、fail、complete,在执行成功的时候回执行success、complete回调;在执行失败之后会分别执行fail、complete回调。

getSotrageSync接口

该接口为同步接口,所以只需传递对应的key值就可以了。如下列代码:

wx.getStorageSync('ob')
//Object {name: "smallerpig", sex: 1, age: 18}

获取当前存储总结

使用wx.getStorageInfo接口

例如下列代码:

wx.getStorageInfo({
 success: function(res) {
 console.log(res.keys)
 console.log(res.currentSize)
 console.log(res.limitSize)
 }
//["logs", "r3session", "key"]0: "logs"1: "r3session"2: "key"]
//1
//10240
})

也可以使用同步接口wx.getStorageInfoSync。

缓存的使用

在上一篇文章中,小猪介绍了如何解密通过wx.getUserInfo接口获取到的cryptedData数据。其中的session_key小猪是写在flask的缓存中,缓存的键是写死为:xcx_session_key。在真实环境中我们不能够这样写,因为这样不同的用户获取到的session_key是相同的,所以我们需要给不同的用户附上不同的缓存key。把flask的缓存key返回给微信小程序,小程序中可以固定一个key值,data值保持flask后台给到的值。

说的比较绕,这里需要读者好好理解下。

在flask的代码的使用code获取session_key中,使用下列代码:

@app.route('/user/getuserinfo', methods=['GET', 'POST'])
def getuserinfo():
 code = request.data
 url = 'https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code' % (appid, secret, code)
 r = requests.get(url)
 j = json.loads(r.text)
 r3session_key = binascii.hexlify(os.urandom(64))
 cache.set(r3session_key, j['session_key'])
 return r3session_key

接下来,在wx.request的回调中把flask中返回的r3session_key保存起来:

wx.request({
 url: 'https://***.smallerpig.com/user/getuserinfo',
 data: r.code,
 method: 'POST',
 success: function(res){
 wx.setStorageSync('r3session', res.data)
 }
})

再接下来,在调用wx.getUserInfo时将返回的数据加上从微信小程序本地缓存中取到的r3session丢给flask来处理,flask根据来的r3session从本地服务器的flask缓存中取到微信的值解密cryptedData。这才是一个完整的过程。

小程序的getUserInfo代码:

wx.getUserInfo({
 success: function (res) {
 that.globalData.userInfo = res.userInfo
 typeof cb == "function" && cb(that.globalData.userInfo)
 //将本地存储中的r3session值也同样传递到我的服务器,在服务器中找出微信给到我们的session_key
 var r3session = wx.getStorageSync('r3session')
 res.r3session = r3session
 wx.request({
  url: 'https://***.smallerpig.com/user/getuserunionid',
  data: res,
  success: function(res){
  // success
  console.log(res)
  },
 })
 }
})

对应的flask代码:

@app.route('/user/getuserunionid', methods=['GET', 'POST'])
def getuserid():
 r = json.loads(request.data)
 encryptedData = r['encryptedData']
 iv = r['iv']
 xcx_session_key = r['r3session']
 session_key = cache.get(xcx_session_key) # 从缓存中取出对应r3session对应的session_key
 pc = WXBizDataCrypt(appid, session_key)
 return pc.decrypt(encryptedData, iv)

参考官方文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/data.html

总结

经过几篇文章的介绍,如果您是按照小猪的代码一步一步做的话你应该已经了解小程序开发的大致过程,接下来的重点无非就是熟悉小程序提供给大家的接口,然后根据这些接口来完善我们的业务逻辑。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JS代码优化技巧之通俗版(减少js体积)
Dec 23 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
js判断IE浏览器版本过低示例代码
Nov 22 Javascript
js读取配置文件自写
Feb 11 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
Sep 01 Javascript
jquery 插件实现瀑布流图片展示实例
Apr 03 Javascript
MVVM模式中ViewModel和View、Model有什么区别?
Jun 19 Javascript
解决jquery中动态新增的元素节点无法触发事件问题的两种方法
Oct 30 Javascript
jQuery Ajax页面局部加载方法汇总
Jun 02 Javascript
浅谈js中子页面父页面方法 变量相互调用
Aug 04 Javascript
JavaScript实现鼠标滚轮控制页面图片切换功能示例
Oct 14 Javascript
微信小程序签到功能
Oct 31 Javascript
从零开始学习Node.js系列教程之设置HTTP头的方法示例
Apr 13 #Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
Apr 13 #Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
Apr 13 #Javascript
angularjs指令之绑定策略(@、=、&)
Apr 13 #Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
Apr 13 #Javascript
详解angularJs指令的3种绑定策略
Apr 13 #Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 #Javascript
You might like
用Apache反向代理设置对外的WWW和文件服务器
2006/10/09 PHP
PHP提取数据库内容中的图片地址并循环输出
2010/03/21 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
php导出csv格式数据并将数字转换成文本的思路以及代码分享
2014/06/05 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
Yii框架的布局文件实例分析
2019/09/04 PHP
javascript+mapbar实现地图定位
2010/04/09 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
2015/03/27 Javascript
内容滑动切换效果jquery.hwSlide.js插件封装
2016/07/07 Javascript
详解AngularJs中$resource和restfu服务端数据交互
2016/09/21 Javascript
jQuery实现复选框的全选和反选
2017/02/02 Javascript
原生js实现日期计算器功能
2017/02/17 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
Bootstrap Table 在指定列中添加下拉框控件并获取所选值
2017/07/31 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python实现电脑自动关机
2018/06/20 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
澳大利亚婴儿、幼儿和儿童在线设计师商店:Smooch Baby
2019/02/16 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
员工自我鉴定范文
2013/10/06 职场文书
毕业生的求职信范文分享
2013/12/04 职场文书
服务口号大全
2014/06/11 职场文书
市场策划求职信
2014/08/07 职场文书
2014年依法行政工作总结
2014/11/19 职场文书
南极大冒险观后感
2015/06/05 职场文书
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis