重复进入页面的时候,报错

来源: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 的拼装,最终是一个不合法的数据

0
0

Scott

2017-12-23

怀疑是二次登陆后,服务端拿到的 user 数据有问题


你在代码上,


iuser = await User.findOne({

                openid:{'$in':[minaUser.openid]}

            }).exec()



这里的后面,加一下 log(iUser) 和 log(minaUser),然后发布上去,本地拿几个账号测试后,看服务器上的 pm2 logs 或者控制台,打印的数据是怎样的,从这个数据入手我们排查看看

0
1
拖车板牙爵士
MongoError: E11000 duplicate key error collection: xiPeral.users index: name_1 dup key: { : null }错误,我百度了一圈,在不删除所有数据的情况下应该怎么补救
2017-12-24
共1条回复

开发微信全家桶项目Vue/Node/MongoDB高级技术栈全覆盖

Nuxt/Vue SSR + Koa2 跨栈开发微信公众号+小程序

989 学习 · 401 问题

查看课程