猿问

Firebase Cloud Function 问题 - promises 相关

我对可调用的 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)

    }


慕雪6442864
浏览 104回答 2
2回答

小怪兽爱吃肉

这是因为对于您通过执行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    })})

慕标5832272

最后我决定async/await为我的云函数编写一个版本。第then一个代码片段中的版本需要的不仅仅是将其添加return到整个 promises 链中(它最初抱怨是因为递归性,也许,要求我添加async到包装函数listAllUsers中......我希望该then版本只是从firebase 文档,但它想要更多)。我想分享这个自制的(但最初测试过的)版本作为带有 async/await 的示例,没有递归性来列出用户admin.auth().listUsers(maxResults?, pageToken?):// get list of usersexports.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  }})
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答