小程序 setStorageSync( ) 存储数据丢失问题

Posted on 2020-06-23 16:48  嗷呜~  阅读(5346)  评论(0编辑  收藏  举报

场景:

近期小程序出现问题,我们在 miniAction接口 获取openId,openId需要在多个页面跨页面用到,用setStorage存储起来,在需要用到openId的地方用 getStorage取,但是上线后,有部分用户反映小程序登录不上去,经查是openId在传输过程中丢失了,查资料,发现 setStorage存储 会出现有的用户丢失的问题。

办法:

通过global全局来跨页面共用数据

存储:

 

 获取:

 

 

代码:

js

export function login(index) {
    global.globalData.ceshi = '测试'
    mpvue.login({
      success(res) {
        wx.showLoading({
          title: "疯狂加载中...",
          mask: true,
        });
        wx.setStorageSync("code", res.code);
        global.globalData.code = res.code
        if (res.code) {
          getOpenId(res.code);
        }
      },
      // 处理登录失败
      fail(res) {
        index++;
        console.log(index,'index+++++')
        if (index < 3) {
          login(index);
        } else {
          wx.showModal({
            title: "提示",

            content: "登录失败,请检查您的当前网络。", //提示错误

            confirmText: "确定",

            confirmColor: "#b8193f",

            showCancel: false,
          });
        }
      },
    });
}

export function getOpenId(code) {
    https.request({
        url: "Welcome/Action",
        data: {
          code: code,
        },
        needToken: false,
        // showLoading: true
      })
      .then((ress) => {
        mpvue.hideLoading();
        if (ress.status) {
          let userInfo = getUserInfo();
          userInfo.openid = ress.data.openId;
          userInfo.unionid = ress.data.unionid;
          userInfo.dxOpenid = ress.data.dxOpenid;
          userInfo.grid_code = ress.data.grid_code
          wx.setStorageSync("openid",ress.data.openId)
          global.globalData.openid = ress.data.openId
          if (ress.data.userInfo.status) {
            userInfo.userInfo = ress.data.userInfo.status;
            userInfo.mainBureauName = ress.data.userInfo.gis.main_bureau_name;
            userInfo.subBureauName = ress.data.userInfo.gis.sub_bureau_name;
            userInfo.mobile = ress.data.userInfo.data.deviceno;
          } else {
            userInfo.userInfo = ress.data.userInfo;
          }
          
          setUserInfo(userInfo);
        } else {
          wx.showModal({
            title: "提示",

            content: "当前网络繁忙,请1分钟后再尝试登录哦~~", //提示错误

            confirmText: "确定",

            showCancel: false,
          });

          console.log("login failed");
        }
      });
}
export function setUserInfo(userInfo){
    wx.setStorageSync('user_info',userInfo)
    global.globalData.userInfo = userInfo

}

// 获取用户信息
export function getUserInfo(settings){
    let userInfo = wx.getStorageSync('user_info') || global.globalData.userInfo || {}
 
    
    return userInfo
}

js

    getUserInfo(e) {
      const that = this;
      if (that.checkVal === "A") {
        // 登录锁
        if (that.logining) {
          console.log("loginning");
          return true;
        } else if(!(wx.getStorageSync("openid")||global.globalData.openid)){
          login(0)
          this.loginingInfo()
        }else {
          this.loginingInfo()
        }
      } else {
        wx.showModal({
          title: "温馨提示",
          content: "请阅读并同意协议",
          showCancel: false,
          success: (res) => {},
        });
      }
    },
    loginingInfo(){
          const that = this
          that.logining = true;
          wx.showLoading({
            title: "疯狂加载中...",
            mask: true,
          });
          mpvue.getUserInfo({
            success(res) {
              let userInfo = getUserInfo()
              userInfo = Object.assign(res.userInfo, userInfo);
             
              let shareId = global.globalData.shareId;
              if (shareId) {
                userInfo.wid = shareId;
              }
              if (wx.getStorageSync("fbc") || global.globalData.fbc) {
                 userInfo.source = wx.getStorageSync("fbc") || global.globalData.fbc;
              }
              if (wx.getStorageSync("jobNum") || global.globalData.jobNum) {
                userInfo.jobNum = wx.getStorageSync("jobNum") || global.globalData.jobNum;
                userInfo.mainBureauName = wx.getStorageSync("mainBureauName") || global.globalData.mainBureauName;
              }
              userInfo.step = "1";
                that
                  .https({
                    url: "User/Login",
                    needToken: false,
                    needUid: true,
                    data: userInfo,
                  })
                  .then((res) => {
                    that.logining = false;
                    mpvue.hideLoading();
                    if (res.status) {
                      console.log("第一步登录成功");
                      if (res.data.id) {
                        userInfo.id = res.data.id;
                      }
                      userInfo.user_type = res.data.type;
                      userInfo.wid = res.data.wid;
                      userInfo.wname = res.data.wname;
                      let token = res.data.token;
                      global.globalData.token = token;
                      wx.setStorageSync("token", token);
                      setUserInfo(userInfo);
                      wx.setStorageSync("hasLogin", true);
                      global.globalData.hasLogin = true;
                      // get_no_read_msg();
                      // 判断step
                      if (res.data.step == 2) {
                        // 获取手机号
                        that.getUserInfos = false;
                        that.isgetPhone = true;
                        that.modalName = true;
                        that.getPhoneNumber();
                      } else if (res.data.step == 3) {
                        that.modalName = true;
                        that.isgetPhone = false;
                        that.getUserInfos = false;
                        that.getLocations = true;
                      } else if (userInfo.wid) {
                        mpvue.redirectTo({
                          url: "/pages/second/main",
                        });
                      } else {
                        // 获取手机号
                        that.getUserInfos = false;
                        that.modalName = true;
                        that.isgetPhone = true;
                        that.getPhoneNumber();
                      }
                    }
                  });

            },
            fail(res) {
              mpvue.hideLoading();
              that.logining = false;
              console.log("fail.......");
              mpvue.openSetting({
                success(res) {
                  console.log(res.authSetting);
                },
              });
            },
            complete(res) {
              console.log("complete");
            },
          });
    },

注意:

在用global存储时,需要注意现在 main.js 定义 global,如下图

 

否则 直接用global.globalData.user_type 会报错 user_type is not definition