热门标签 | 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 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了一个React Native新手在尝试将数据发布到服务器时遇到的问题,以及他的React Native代码和服务器端代码。他使用fetch方法将数据发送到服务器,但无法在服务器端读取/获取发布的数据。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Vue3中setup函数的参数props和context配置详解
    本文详细介绍了Vue3中setup函数的参数props和context的配置方法,包括props的接收和配置声明,以及未通过props进行接收配置时的输出值。同时还介绍了父组件传递给子组件的值和模板的相关内容。阅读本文后,读者将对Vue3中setup函数的参数props和context的配置有更深入的理解。 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文讨论了将HashRouter改为Router后,页面全部变为空白页且没有报错的问题。作者提到了在实际部署中需要在服务端进行配置以避免刷新404的问题,并分享了route/index.js中hash模式的配置。文章还提到了在vueJs项目中遇到过类似的问题。 ... [详细]
author-avatar
恨透这一切_249
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有