收藏
回答

用户授权,获取app.globalData.userInfo为undefined?

查了很多资料说是异步问题,也做了修改,但还是为undefined。要怎么修改?求帮助、

app.js打印的图片

login.js打印的图片

// app.js
App({
  onLaunch:async function () {
    if (!wx.cloud) {
      console.error('请使用 2.2.3 或以上的基础库以使用云能力');
    } else {
      wx.cloud.init({
        env'1g4z5k3lc74cf9e2',
        traceUsertrue,
      });
    }

    this.globalData = {};
    await this.loadUserInfo();
    console.log('loadUserInfo有没有执行',this.loadUserInfo);
    console.log('有没有获取到userInfo',this.globalData.userInfo);
  },
  async loadUserInfo() {
    var that = this;
    let loginOpenid = await wx.cloud.callFunction({
      name:'logins',
    })
    console.log('获取用户openid',loginOpenid);
    that.globalData.openid = loginOpenid.result.openid;
    console.log('保存openid',that.globalData.openid);
    
    const loginRes = await wx.cloud.database().collection('login')
      .where({
        _openid:'loginOpenid'
      }).get()
    console.log('查询是否有用户信息',loginRes);
    that.globalData.userInfo = loginRes.data[0];
    console.log('保存用户信息到globalData',that.globalData.userInfo);
  },
  is_login() {
    console.log('is_logn获取',this.globalData.userInfo);
    if (this.globalData.userInfo) {
      return true
    } else {
      return false
    }
    
  },
})

login.js代码

// pages/login/login.js
const app = getApp();
const db = wx.cloud.database();
Page({
  data: {
  
  },

  onLoad(options) {


  },
  // 获取头像
  getAvatar(event) {
    console.log('临时头像路劲地址',event.detail.avatarUrl); //临时头像路劲地址
    let avatarUrl = event.detail.avatarUrl; //临时地址
    let suffix = /\.[^\.]+$/.exec(avatarUrl)[0];
    wx.cloud.uploadFile({
      cloudPath'loginImages/' + new Date().getTime() + suffix,
      filePath: avatarUrl //上传到云端的路劲,
    }).then(res => {
      console.log('头像路劲地址',res.fileID);
      this.setData({
        avatarUrl: res.fileID
      })
    })
  },
  async login(event) {
    console.log(event);
    let nickName = await event.detail.value.nickName;
    console.log('用户名', nickName);
    if(!nickName){
      wx.showToast({
        title:'请填写昵称',
        icon:'error'
      })
      return
    }


    if(!this.data.avatarUrl){
      wx.showToast({
        title:'请上传头像',
        icon:'error'
      })
      return
    }


    let openid =await app.globalData.openid;
    console.log("获取app.globalData.openid",openid);


    try{
      let existingUserQuery = await db.collection('login').where({
        _openid:openid
      }).get();
      console.log('获取用户信息',existingUserQuery)
      if(existingUserQuery.data.length > 0){
        this.setData({
          userInfo:existiongUserQuery.data[0],
        });
      }else{
        let newUser = {
          num:Date.now(),
          avatarUrl:this.data.avatarUrl,
          nickName:nickName,
        };
        await db.collection('login').add({
          data:newUser
        });
      }
     
    }catch(err){
      console.log('Error',err);
    }
    wx.showToast({
      title:'登陆成功'
    });
    setTimeout(()=>{
      wx.navigateBack({});
    },1500)
  },
})

user-center.js代码

const app = getApp();
console.log('是否有app信息',app)
const db = wx.cloud.database();
Page({
    data: {

    },

    onLoad:async function(options{
        console.log('是否有传递数据',app.is_login());
       if(app.is_login()){
        this.setData({
               userInfo: app.globalData.userInfo,
               avatarUrl: app.globalData.userInfo.avatarUrl,
               nickName: app.globalData.userInfo.nickName
           })
       }
    onuserInfo(e){ 
        wx.navigateTo({
            url:'/pages/login/login'
        })       
    },
    
回答关注问题邀请回答
收藏

3 个回答

  • 跨商通
    跨商通
    06-10
    await this.loadUserInfo();
    

    这句代码不要在app.js的onLaunch里执行。

    在page.js的onLoad里执行就行了。

      onLoad: async function (options) {
        await app.loadUserInfo();
        console.log(app.globalData.userInfo)
      },
    
    
    06-10
    有用 1
    回复 1
    • 蓝天☁
      蓝天☁
      发表于移动端
      06-10
      非常感谢,搞定了,查了这么久的资料,没有一个针对性的知识点,都山穷水尽了
      06-10
      回复
  • 朱兆恩(易做图)
    朱兆恩(易做图)
    06-08

    记得现在的规则是:

    用户点击按钮,再获取用户资料

    06-08
    有用
    回复
  • 郑钱花
    郑钱花
    06-08

    仍然是异步问题

    loadUserInfo函数内部随便return一个东西值,比如return loginRes这样await this.loadUserInfo() 才会在有返回值之后打印console.log('有没有获取到userInfo',this.globalData.userInfo);。否则异步还没结果,console.log就执行了

    06-08
    有用
    回复 3
    • 蓝天☁
      蓝天☁
      06-08
      改了,还是一样的问题,是不是这样?console.log(‘有没有获取到userInfo’,this.globalData.userInfo);打印出来的结果是有值,但是为啥在is_login()方法中就是undefined,在我的页面中,也获取不到。就是授权后,用户头像未登录和已登陆没有切换。
      06-08
      回复
    • 郑钱花
      郑钱花
      06-08回复蓝天☁
      这个你就自己查下,把异步玩明白了。检查我的页面中is_login调用的是时候,异步的查询用户信息是否已结束
      06-08
      回复
    • 蓝天☁
      蓝天☁
      06-08
      那要怎么才知道is_login调用的时候,异步查询有没有结束呢?
      这个顺序是不是,先执行app.js中的is_login() 方法,再是我的页面中调用is_login,在调试器中,打印的结果中,顺序是这样?
      06-08
      回复
登录 后发表内容