微信小程序:将本地缓存数据存储到云数据库,再将云数据库数据恢复到
2022-03-04 本文已影响0人
我的小小笔尖
云函数代码,其中两个方法:
- 存储本地缓存数据
- 获取最新的本地缓存数据
// 云函数入口文件
const cloud = require('wx-server-sdk')
const envId = 'cloud1-888888888888888'
cloud.init({
traceUser: true,
env: envId
})
const db = cloud.database()
const _ = db.command
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
switch (event.action) {
// 本地存储保存到云端
case 'saveLocalStorage': {
return saveLocalStorage(event, wxContext)
}
// 读取云端的本地存储
case 'recoverLocalStorage': {
return recoverLocalStorage(event, wxContext)
}
default: {
return
}
}
}
// 本地存储保存到云端
async function saveLocalStorage(event, wxContext) {
let saveDate = new Date()
try {
return await db.collection('localStorage').add({
data: {
// 冗余数据
event: event,
wxContext: wxContext,
// 用户的openid
_openid: wxContext.OPENID,
// 存储时间和时间戳
saveDate: saveDate,
saveTimestamp: saveDate.getTime(),
// 本地存储数据
localStorage: event.localStorage
}
})
} catch (e) {
console.error(e)
}
}
// 读取云端的本地存储
async function recoverLocalStorage(event, wxContext) {
try {
return await db.collection('localStorage').where({
//只能查询自己的
_openid: wxContext.OPENID
})
.orderBy('saveTimestamp', 'desc').limit(1).get() // 时间倒序,仅获取最新的一条
} catch (e) {
console.error(e)
}
}
将本地存储数据上传到云数据库:
- 先获取本地缓存数据,所有的key及其value数据
- 调用云函数存储数据
- 提示存储完成
// 将本地存储数据上传到云数据库
remoteSaveGameStorage() {
var that = this
let gameStorage = []
const res = wx.getStorageInfoSync()
let keys = res.keys
// console.log(keys)
for(let i=0; i<keys.length; i++) {
let key = keys[i]
const value = wx.getStorageSync(key)
// console.log(i, key, value)
gameStorage.push({
key: key,
value: value,
})
}
// console.log('gameStorage', gameStorage)
// 调用云函数存储数据
wx.cloud.callFunction({
// 要调用的云函数名称
name: 'localStorage2CloudStorage',
// 传递给云函数的参数
data: {
action: 'saveLocalStorage',
localStorage: gameStorage,
},
success: res => {
// output: res.result === 3
console.log('success', res)
},
fail: err => {
// handle error
console.log('fail', err)
},
complete: () => {
// ...
console.log('complete')
this.setData({
popupSettingsBoxFlg: false,
})
wx.showToast({
icon: 'none',
title: '游戏存档完成',
mask: true,
duration: 1000,
})
}
})
},
将服务器数据恢复到本地游戏
- 调用云函数获取最新的缓存数据
- 先清除本地缓存(why? 避免key的个数不同,导致新旧数据同时存在)
- 再将数据按照key/value逐个恢复为本地缓存
- 刷新页面
// 将服务器数据恢复到本地游戏
recoverRemoteGameStorage() {
let gameStorage = []
// 调用云函数获取数据
wx.cloud.callFunction({
// 要调用的云函数名称
name: 'localStorage2CloudStorage',
// 传递给云函数的参数
data: {
action: 'recoverLocalStorage',
},
success: res => {
// output: res.result === 3
console.log('success', res)
if(typeof(res.result)!='undefined' && typeof(res.result.data)!='undefined' && res.result.data.length==1) {
gameStorage = res.result.data[0].localStorage
console.log('gameStorage', gameStorage)
// 获取到数据才会恢复
if(gameStorage.length>0) {
// 先清空本地缓存
wx.clearStorage({
success: res => {
console.log('清空本地缓存成功', res)
// 再恢复本地缓存
console.log('recover start ...')
for(let i=0; i<gameStorage.length; i++) {
let key = gameStorage[i].key
let value = gameStorage[i].value
try {
wx.setStorageSync(key, value)
console.log('recover', key)
} catch (e) {
console.log('fail', key, e)
}
}
console.log('recover end.')
// 刷新页面
wx.redirectTo({
url: './main',
})
},
fail: err => {
console.log('清空本地缓存失败', err)
},
complete: res => {
console.log('执行 wx.clearStorage 完成')
}
})
}else {
console.log('no data 2 recover')
}
}else {
console.log('no data')
}
},
fail: err => {
// handle error
console.log('fail', err)
},
complete: () => {
// ...
console.log('complete')
}
})
},