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

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

作者: 我的小小笔尖 | 来源:发表于2022-03-04 21:18 被阅读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')
          }
        })
      },
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/pegmrrtx.html