重复进入页面的时候,报错
来源:8-5 为小程序实现后端登录路由
拖车板牙爵士
2017-12-22
小程序请求登录接口,在index的onLoad函数中调用login接口
getUserInfo: function(cb) { var that = this if (this.globalData.userInfo) { typeof cb == "function" && cb(this.globalData.userInfo) } else { //调用登录接口 wx.login({ success: function (response) { wx.getUserInfo({ success: function (res) { console.log(res) that.globalData.userInfo = res.userInfo wx.request({ url: that.globalData.serverUrl + '/api/login', data: { code: response.code, userInfo: res }, method: 'POST', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT header: { 'content-type': 'application/json' },// 设置请求的 header success: function (ctx) { // success console.log(ctx.data.data.openid) }, fail: function (ctx) { wx.showModal({ title: '提醒', content: '注册失败,请删除小程序重新进入!', showCancel: false, success: function (modal) { } }) } }) typeof cb == "function" && cb(that.globalData.userInfo) }, fail: function (res) { wx.redirectTo({ url: '../authorize/authorize', }) } }) } }) } }
服务器登录接口代码
export async function appLogin (ctx, next) { const { code, userInfo} = ctx.request.body let iuser let _userInfo try{ const minaUser = await openidAndSessionKey(code) const wxBizDataCrypt = new WXBizDataCrypt(minaUser.session_key) const decryptData = wxBizDataCrypt.decryptData(userInfo.encryptedData, userInfo.iv) iuser = await User.findOne({ openid:{'$in':[minaUser.openid]} }).exec() if (!iuser) { _userInfo = userInfo.userInfo iuser = new User({ avatarUrl: _userInfo.avatarUrl, nickname: _userInfo.nickName, openid: [ minaUser.openid ], gender: _userInfo.gender, country: _userInfo.country, province: _userInfo.province, city: _userInfo.city }) await iuser.save() }else { iuser.avatarUrl = _userInfo.avatarUrl iuser.nickname = _userInfo.nickName await iuser.save() } ctx.body = { success: true, data: { avatarUrl: _userInfo.avatarUrl, nickname: _userInfo.nickName, openid: minaUser.openid } } }catch(e){ ctx.body = { success: false, err: e } } }
在数据库里没有用户数据的时候,首次授权会插入一条数据,不会报错,但是,不做任何操作,在小程序的任何文件不做任何操作,保存一下,小程序会重新载入一次,这时候,就会报错,因为wx.login走了,wx.getUserInfo也走了,自己的登录接口也走了
经过多个开发者账号,多次测试,发现,只有user的表里有一条数据,添加用户或更新用户就会报错,把user表清空了,首次执行就不会报错。
thirdScriptError Cannot read property 'openid' of undefined;at pages/index/index onReady function;at api request success callback function TypeError: Cannot read property 'openid' of undefined at Function.success (http://127.0.0.1:9973/appservice/app.js:35:62) at Object.success (http://127.0.0.1:9973/appservice/__dev__/WAService.js:3:11024) at s.<anonymous> (http://127.0.0.1:9973/appservice/__dev__/WAService.js:8:23191) at s.emit (http://127.0.0.1:9973/appservice/__dev__/WAService.js:4:20086) at Function.<anonymous> (http://127.0.0.1:9973/appservice/__dev__/WAService.js:8:24539) at http://127.0.0.1:9973/appservice/__dev__/WAService.js:4:4162 at d (http://127.0.0.1:9973/appservice/appservice:1423:6421) at b.<anonymous> (http://127.0.0.1:9973/appservice/appservice:1423:6501) at b.emit (http://127.0.0.1:9973/appservice/appservice:1423:19498) at callback (http://127.0.0.1:9973/appservice/appservice:1423:12337)
写回答
2回答
-
Scott
2017-12-27
可以把 这几个 user 变量打印下,应该是哪里不严谨导致了 { : null } ,这里是 key 为空,且值为 null,是不符合预期的脏数据,看看是不是拿到的 openid 或者 name,以及 object 的拼装,最终是一个不合法的数据
00 -
Scott
2017-12-23
怀疑是二次登陆后,服务端拿到的 user 数据有问题
你在代码上,
iuser = await User.findOne({
openid:{'$in':[minaUser.openid]}
}).exec()
这里的后面,加一下 log(iUser) 和 log(minaUser),然后发布上去,本地拿几个账号测试后,看服务器上的 pm2 logs 或者控制台,打印的数据是怎样的,从这个数据入手我们排查看看
012017-12-24
相似问题