亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 95 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號