热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

场景:近期小程序出现问题,我们在miniAction接口获取openId,openId需要在多个页面跨页面用到,用setStorage存储起来,在需要用到openId的地方用get

场景:

近期小程序出现问题,我们在 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/miniAction",
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;
}
console.log(userInfo,'miniAction')
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();
console.log(userInfo,'logingInfo')
console.log(global.globalData.ceshi)
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/userLogin",
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



推荐阅读
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 本文介绍了如何使用vue-awesome-swiper组件,包括在main.js中引入和使用swiper和swiperSlide组件,以及设置options和ref属性。同时还介绍了如何在模板中使用swiper和swiperSlide组件,并展示了如何通过循环渲染swipes数组中的数据,并使用picUrl属性显示图片。最后还介绍了如何添加分页器。 ... [详细]
  • 本文介绍了如何使用elementui分页组件进行分页功能的改写,只需一行代码即可调用。通过封装分页组件,避免在每个页面都写跳转请求的重复代码。详细的代码示例和使用方法在正文中给出。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
  • 本文介绍了如何在Jquery中通过元素的样式值获取元素,并将其赋值给一个变量。提供了5种解决方案供参考。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
author-avatar
祗想抱著伱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有