为了账号安全,请及时绑定邮箱和手机立即绑定

Firebase Cloud Function 问题 - promises 相关

Firebase Cloud Function 问题 - promises 相关

慕雪6442864 2022-12-02 16:12:10
我对可调用的 firebase 云函数 ( exports.listAllUsers ) 有疑问。后端:使用admin.auth().listUsers的 Nodejs 和 Firebase-Cloud_functions问题:结果(usersList;具有用户 uid 的数组)在云函数模拟器(日志)中正常,但在客户端(控制台)中无效。浏览器中的 log(usersList) 为空)可能是与...相关的问题:对承诺的理解不好。第二个代码示例使用 async/await 但不使用 .then()。函数listAllUsers的代码基本上是从文档中复制粘贴的(原始代码片段:https ://firebase.google.com/docs/auth/admin/manage-users#list_all_users )。我的代码修改为5(代码中的注释),获取用户uid列表:    exports.listAllUsers = functions.https.onCall(() => { // -1) callable function      const usersList = ['12323211'] // ----------------------2) first user uid, just a sample      function listAllUsers (nextPageToken) {        // List batch of users, 1000 at a time.        admin.auth().listUsers(1000, nextPageToken)          .then((listUsersResult) => {            listUsersResult.users.forEach((userRecord) => {              usersList.push(userRecord.uid) // --------------3) get users uids            })            if (listUsersResult.pageToken) {              // List next batch of users.              listAllUsers(list我正在使用 firebase 模拟器。Cloud functions log没问题,可以看到sample uid和其他uid:云函数模拟器控制台输出但我在客户端没有得到相同的结果:客户端控制台输出我想我在做一些与承诺相关的错误......因为代码的简化正在使用异步/等待:UsersResult.pageToken)            }            console.log(usersList) //-------------------------4) list users uid (cloud functions console)            return usersList //-------------------------------5) return to the client the same as showed at the console          })          .catch((error) => {            console.log('Error listing users:', error)            return null          })      }      // Start listing users from the beginning, 1000 at a time.      listAllUsers()    })客户端中的方法是...getUsersList: async function (userType) {      const usersList = await this.$fb.functions().httpsCallable('listAllUsers')()      console.log('usersList: ', usersList)    }
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

这是因为对于您通过执行async/await正确返回的版本listUsersResult


    listUsersResult = await admin.auth().listUsers()

    return listUsersResult

但是,对于这个then版本,你不需要。您应该返回整个承诺链,如下所示:


exports.listAllUsers = functions.https.onCall(() => {

  return admin.auth().listUsers()   // !!! Note the return here  !!!

    .then((listUsersResult) => {

      return listUsersResult

    })

    .catch((error) => {

      console.log('Error listing users:', error)

      return null

    })

})


查看完整回答
反对 回复 2022-12-02
?
慕标5832272

TA贡献1966条经验 获得超4个赞

最后我决定async/await为我的云函数编写一个版本。第then一个代码片段中的版本需要的不仅仅是将其添加return到整个 promises 链中(它最初抱怨是因为递归性,也许,要求我添加async到包装函数listAllUsers中......我希望该then版本只是从firebase 文档,但它想要更多)。


我想分享这个自制的(但最初测试过的)版本作为带有 async/await 的示例,没有递归性来列出用户admin.auth().listUsers(maxResults?, pageToken?):


// get list of users

exports.listAllUsers = functions.https.onCall(async () => {

  const usersList = []

  try {

    let listUsersResult

    let nextPageToken

    do {

      if (listUsersResult) {

        nextPageToken = listUsersResult.pageToken

      }

      // eslint-disable-next-line no-await-in-loop

      listUsersResult = await admin.auth().listUsers(1000, nextPageToken)

      listUsersResult.users.forEach((userRecord) => {

        usersList.push(userRecord.uid)

      })

    } while (listUsersResult.pageToken)

    return usersList

  } catch (error) {

    console.log('Error listing users:', error)

    return null

  }

})


查看完整回答
反对 回复 2022-12-02
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号