微信小程序:将本地缓存数据存储到云数据库,再将云数据库数据恢复到

2022-03-04  本文已影响0人  我的小小笔尖

云函数代码,其中两个方法:

  1. 存储本地缓存数据
  2. 获取最新的本地缓存数据
// 云函数入口文件
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)
  }
}

将本地存储数据上传到云数据库:

  1. 先获取本地缓存数据,所有的key及其value数据
  2. 调用云函数存储数据
  3. 提示存储完成
  // 将本地存储数据上传到云数据库
  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,
        })
      }
    })
  },

将服务器数据恢复到本地游戏

  1. 调用云函数获取最新的缓存数据
  2. 先清除本地缓存(why? 避免key的个数不同,导致新旧数据同时存在)
  3. 再将数据按照key/value逐个恢复为本地缓存
  4. 刷新页面
  // 将服务器数据恢复到本地游戏
  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')
      }
    })
  },
上一篇下一篇

猜你喜欢

热点阅读