1. Cannot read property ‘openid’ of null?
- 一、问题简述
云函数login,想必是小程序开发者在开发的时候经常用于获取小程序用户信息的云函数,我的login具体结构如下:
下面附上一条小程序官网提供的《获取小程序用户信息》 ,里面有怎样获取用户信息
现在我们根据官网模板修改login/index.js,具体如下:
现在我们开始调用,调用代码如下:
1. // --------------------上面代码省略
2. wx.cloud.callFunction({
3. name: 'login',
4. data:{},
5. success: res => {
6. console.log('------------------',res)
7. this.globalData.openid = res.result.OPENID
8. },
9. fail: err => {
10. console.error('[云函数] [login] 调用失败', err)
11. }
12. })
13. // --------------------下面代码省略
发现一直获取不到数据(即result 为空),错误如下:
- 二、寻找原因
返回信息里面:errMsg: “cloud.callFunction:ok”说明云函数调用成功,也就是说明index.js代码里面没有问题,我们查看了日志更加说明了这一点(调用成功,返回结果为null),具体日志如下:
2.1函数详情
既然函数调用成功,并且返回为空,那么现在只能通过函数里面的返回值去查找答案了,上面函数我们在里面仅仅调用了一个”wx.server.sdk“提供的getWXContext函数,现在我们搜索一下关于getWXContext函数的具体信息,官方描述如下《Cloud.getWXContext(): Object》
发现官方文档仅仅是说了两个需要注意的事情:
- 返回值
- 不要在
exports.main
外使用getWXContext
,此时尚没有调用上下文,无法获取得到信息
上面并没有我们解决办法的信息…
- 2.2异步问题
函数详情并没有找到相应的解决办法,可是在查阅官方文档的过程中,我发现了一个问题=>《异步API》,描述如下:
看到这里,我在想:是不是因为getWXContext函数是异步获取的,从而导致返回为空!!!
三、验证结果
我们修改一下我们的代码(添加了async&await): ```
- // index.js
- const cloud = require(‘wx-server-sdk’)
- exports.main = async (event, context) => {
- // 这里获取到的 openId、 appId 和 unionId 是可信的,注意 unionId 仅在满足 unionId 获取条件时返回
- let { OPENID, APPID, UNIONID } = await cloud.getWXContext()
- return {
- OPENID,
- APPID,
- UNIONID,
- }
- }
```
通过async&await等待cloud.getWXContext()返回结果注意: 在修改了云函数之后必须上传并部署!!!
- 有通过npm install下载库文件,则需要更新node_modules,即需要上传并部署:所有文件
- 如果仅仅是修改了index.js这些,直接上传并部署:云函数安装依赖(不上传node_modules)即可
发现问题解决,返回成功!!!
- 四、结论
getWXContext函数是异步的,需要通过await等待其的返回!!!