m0_62833091 2024-06-09 13:31 采纳率: 63.2%
浏览 4
已结题

用户授权,glodalData.userInfo为undefined?

app.js异步问题,在我的页面中,可以拿到app.globalData的信息,但是app.globalData.userInfo拿不到,下面是全部代码,要怎么改?求帮助

img

app.js代码:

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

    this.globalData = {};
    await this.loadUserInfo();
    console.log('是否有openid',this.globalData.openid);
    console.log('是否有用户信息',this.globalData.userInfo);
  },

  async loadUserInfo(){
      var that = this;
      //获取用户的openid
    let useropenid = await wx.cloud.callFunction({
      name:'logins',
    })
    console.log('获取openid',useropenid);
    that.globalData.openid = await useropenid.result.appid;

    return await wx.cloud.database().collection('login').where({
        _openid:'that.globalData.openid'
    }).get().then(res=>{
        console.log(res);
        that.globalData.userInfo = res.data[0];
    }) 
  },

  is_login(){
    console.log(this.globalData.userInfo);
    if (this.globalData.userInfo) { 
      return true
    } else {
      return false
    }
  },
})

login WXML代码

<button class="but" open-type="chooseAvatar" bindchooseavatar="getAvatar">
    <image class="face" src="{{avatarUrl?avatarUrl:'../../images/avatar.png'}}"></image>
</button>
<form bindsubmit="login">
    <input class="nick" type="nickname" placeholder="请输入昵称" name="nickName" />
    <button form-type="submit" type="primary">登陆</button>
</form>


login .js代码


```javascript
// 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
      })
    })
  },
  login(event) {
    var that = this;
    console.log(event.detail.value.nickName);
    let nickName = event.detail.value.nickName;
    // let avatarUrl = that.data.avatarUrl;
    if (!nickName) {
      wx.showToast({
        title: '请填写昵称',
        icon: 'error'
      })
      return
    }
    if (!this.data.avatarUrl) {
      wx.showToast({
        title: '请上传头像',
        icon: 'error'
      })
      return
    }
    console.log(app.globalData.openid);
    db.collection('login').where({
      _openid: app.globalData.openid
    }).get().then(res => {
      console.log(res)
      if (res.data.length == 0) {
        //添加记录到数据库
        db.collection('login').add({
          data: {
            num: Date.now(), //!QQ号
            avatarUrl: that.data.avatarUrl,
            nickName: nickName
          },
          success(res) {
            console.log(res)
            wx.showToast({
              title: '登陆成功',
            })
            setTimeout(function () {
              wx.navigateBack({})
            }, 1500)
          }
        })
      } else {
        console.log("用户已存在")
        that.setData({
          userInfo: res.data[0]
        })
      }
    })
  }

})


我的页面user-center。WXML代码:

```xml
<view class="userinfo-group">
    <!-- 已登陆 -->
    <view class="user-group" wx:if="{{userInfo != null}}">
        <image class="avatra" src="{{avatarUrl?avatarUrl:'../../images/avatar.png'}}"></image>
        <view class="right-group">
            <view class="nickname">用户名:{{nickName}}</view>
            <view class="ID">用户ID:dfd9765490</view>
        </view>
    </view>
    <!-- 未登陆 -->
    <block wx:if="{{userInfo == null}}">
        <view class="user-group" bind:tap="onuserInfo">
            <image class="avatra" src="../../images/avatar.png"></image>
            <view class="right-group">
                <view class="nickname">点击登录</view>
                <view class="ID">登录获取更多权限</view>
            </view>
        </view>
    </block>
    <view class="list-group">
        <view class="balance">余额:¥ 0 元</view>
        <view class="recharge">充值</view>
    </view>
    <view class="me-release">我发布的信息</view>
</view>


我的页面user-center.js代码:

// pages/user-center/user-center.js
const app = getApp();
const db = wx.cloud.database();
Page({

    /**
     * 页面的初始数据
     */
    data: {

    },

    /**
     * 生命周期函数--监听页面加载
     */
    onLoad(options) {
        console.log('是否有app信息',app.globalData)// 有app的信息
        console.log('是否有用户信息',app.globalData.userInfo)// 获取用户信息和openid为undefined
        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(){ 
        wx.navigateTo({
            url:'/pages/login/login'
        })       
    },

})

  • 写回答

1条回答 默认 最新

  • 阿里嘎多学长 2024-06-09 13:46
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码和描述,您遇到的问题主要是globalData.userInfo获取为undefined。以下是一些可能的原因和建议的解决方案:

    1. 异步操作顺序问题: 在onLaunch函数中,您使用了await来加载用户信息,但是await之后的代码可能在loadUserInfo函数执行完成之前就执行了。这可能导致globalData.userInfo尚未被设置。

      解决方案:确保await this.loadUserInfo();onLaunch函数中是最后一个执行的语句,并且在其之后不要立即访问globalData.userInfo

    2. loadUserInfo函数中的错误: 在loadUserInfo函数中,您使用了that.globalData.openid,但是that可能没有正确指向App实例。

      解决方案:使用this.globalData.openid代替that.globalData.openid

    3. 数据库查询条件错误: 您在查询数据库时使用了where方法,但是条件中的_openid值可能不正确。图片中显示的openidwx990cfc380f474695,但是在查询时您使用了that.globalData.openid,这可能不是正确的值。

      解决方案:确保查询时使用的_openid值是正确的,并且与用户实际的openid匹配。

    4. is_login函数中的逻辑问题is_login函数中直接返回了this.globalData.userInfo的值,如果globalData.userInfoundefined,它也会返回undefined

      解决方案:在is_login函数中添加一个检查,确保globalData.userInfo不是undefined

    5. user-center.js中的访问时机问题user-center.js中的onLoad函数可能在globalData.userInfo设置之前被调用。

      解决方案:您可以考虑在onLoad函数中添加一个延时或者使用页面的onShow生命周期函数来确保globalData.userInfo已经被设置。

    6. setData方法的使用: 在login函数中,您使用了this.setData来设置userInfo,但是this可能指向的是页面实例而不是App实例。

      解决方案:确保在login函数中使用正确的this来设置globalData.userInfo

    7. 代码中的其他潜在问题

      • 检查login函数中是否正确处理了数据库操作的异步性。
      • 确保login函数在添加新用户或更新现有用户信息后正确地更新了globalData.userInfo

    最后,关于参考资料,您可以查阅微信小程序的官方文档,特别是关于全局数据管理云函数调用的部分。

    希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多的信息,以便进一步分析。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月21日
  • 已采纳回答 7月13日
  • 创建了问题 6月9日

悬赏问题

  • ¥15 这个如何解决详细步骤
  • ¥15 在微信h5支付申请中,别人给钱就能用我的软件,这个的所属行业是啥?
  • ¥30 靶向捕获探针设计软件包
  • ¥15 react-diff-viewer组件,如何解决数据量过大卡顿问题
  • ¥20 遥感植被物候指数空间分布图制作
  • ¥15 安装了xlrd库但是import不了…
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢