我有一个可调用的firebase云函数(exports.listAllUsers(的问题。
后端:Nodejs&使用admin.auth((.listUsers的Firebase-Cloud_functions
问题:结果(usersList;包含用户uid的数组(在云函数模拟器(日志(中可以,但在客户端中不可以(浏览器中的console.log(usersList(为null(
可能是与…有关的问题:
函数listAllUsers的代码基本上是copy&从文档粘贴(原始代码狙击: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(listUsersResult.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)
}
我正在使用firebase模拟器。云函数日志是可以的,你可以看到示例uid和其他uid:
云功能模拟器控制台输出
但我在客户端上没有得到同样的结果:
客户端控制台输出
我觉得我做错了一些与承诺有关的事情。。。因为代码的简化使用async/await:
exports.listAllUsers = functions.https.onCall(async () => {
try {
listUsersResult = await admin.auth().listUsers()
return listUsersResult
} catch (error) {
console.log('Error listing users:', error)
return null
}
})
浏览器控制台输出(减少了异步/等待代码(
但同样的方法不适用于then((。。。
exports.listAllUsers = functions.https.onCall(() => {
admin.auth().listUsers()
.then((listUsersResult) => {
return listUsersResult
})
.catch((error) => {
console.log('Error listing users:', error)
return null
})
})
浏览器控制台输出(使用.then((减少代码(
我可以用async/await重构最初的代码片段,但我对原始代码(.then((风格的解决方案感兴趣;我总是使用async/await,因为我对js很陌生。。。有人能帮我吗?谢谢
这是因为对于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
})
})
最后我决定为我的云函数编写一个async/await
版本。第一个代码狙击中的then
版本需要的不仅仅是将return
添加到整个promise链中(它最初抱怨的原因可能是递归性,要求我将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
}
})