如何等待Firebase admin.auth(). getuser()函数



我有一个函数,应该返回用户的电子邮件从使用Firebase管理API getUser(uid)函数,

function getEmail(uid){
var email;
admin.auth().getUser(uid)
.then((userRecord) => {
return userRecord.email;
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
}

但是在另一个函数中当我创建一个变量来调用这个函数时,

email = getEmail(uid);

email中的值是未定义的,因为getUser函数返回了一个promise。如何使getEmail函数在返回之前等待获得userRecord的值?

我试过在函数的不同部分添加await语句,但我不确定如何正确地做到这一点。我是使用Google API的初学者。

返回getEmail函数中从admin.auth().getUser(uid)获得的Promise

function getEmail(uid) {
return admin.auth().getUser(uid)
.then((userRecord) => {
return userRecord.email;
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
}

然后使用返回的Promise链接then回调。

getEmail(uid).then(email => {
console.log(email);
});

或者在async函数中等待。

async function main() {
const email = await getEmail(uid);
console.log(email);
}
main();

编辑

正如你在下面的评论中所解释的:

基本上,我只是想让代码运行起来就好像它都是同步的/逐行的。

让异步代码同步是不可能的,但是用async / await语法让它逐行运行是可能的。在异步函数中等待的承诺将逐行运行,因为你告诉代码在进入下一行之前等待它的解析。

我已经修改了来自CodePen的代码以包含上述语法。我们仍然使用相同的getEmail函数,从admin.auth().getUser(uid)返回承诺,只是等待它完成,然后再处理结果。

function getEmail(uid) {
return admin.auth().getUser(uid)
.then((userRecord) => {
return userRecord.email;
})
.catch((error) => {
console.log('Error fetching user data:', error);
});
}
app.post("/sendx", async (req, res) => {
const uid = req.body.x.user.uid;
const email = await getEmail(uid);
let verified = false;
/*console.log(email.substring(email.indexOf('@')));
if (email.substring(email.indexOf('@')) == "@xxx.edu") {
verified = true; 
}*/
res.send({ verified });
});

我希望这能澄清问题。

最新更新