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


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 相关文章推荐
另类调用flash无须激活的方法
Dec 27 Javascript
Span元素的width属性无效果原因及解决方案
Jan 15 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
Oct 15 Javascript
jQuery中add实现同时选择两个id对象
Oct 22 Javascript
jquery实现excel导出的方法
Apr 04 Javascript
AJAX跨域请求json数据的实现方法
Nov 11 Javascript
JS+CSS实现的漂亮渐变背景特效代码(6个渐变效果)
Mar 25 Javascript
Angularjs中UI Router的使用方法
May 14 Javascript
原生js实现验证码功能
Mar 16 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
使用vue-router与v-if实现tab切换遇到的问题及解决方法
Sep 07 Javascript
Vue-router编程式导航的两种实现代码
Mar 04 Vue.js
从零开始学习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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
浅析PHP 按位与或 (^ 、&)
2013/06/21 PHP
php图片缩放实现方法
2014/02/20 PHP
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
extJs 下拉框联动实现代码
2010/04/09 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
2011/07/31 Javascript
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
javascript几个易错点记录
2014/11/26 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
如何减少浏览器的reflow和repaint
2015/02/26 Javascript
纯JavaScript手写图片轮播代码
2016/10/20 Javascript
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
2020/04/15 Javascript
vue 项目中当访问路由不存在的时候默认访问404页面操作
2020/08/31 Javascript
python开发环境PyScripter中文乱码问题解决方案
2016/09/11 Python
Python探索之Metaclass初步了解
2017/10/28 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
深入理解Django-Signals信号量
2019/02/19 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
Python TestSuite生成测试报告过程解析
2020/07/23 Python
python利用opencv保存、播放视频
2020/11/02 Python
python如何写个俄罗斯方块
2020/11/06 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
优秀员工自荐书
2015/03/06 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
文艺委员竞选稿
2015/11/19 职场文书
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
Java实现多文件上传功能
2021/06/30 Java/Android
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
2022/03/16 Redis
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers