如何解决firebase 云函数调用回调
我正在使用 firebase admin SDK 为我的网络应用创建新用户。
// function to create user and store additional info in firestore
exports.createuser = functions
.https.onCall((data,context) => {
admin.auth().createuser({
phoneNumber: data.phoneNumber,displayName: data.displayName,}).then((user) => {
// store data in firestore
admin.firestore().collection("user").doc(user.uid).set({...data});
}).catch((err) => {
// handle error
});
});
当我从客户端调用该函数(将其附加到 onClick 事件)时,我想等到用户成功添加到 firestore 并调用 fetchUser 函数,以便我可以看到新添加的用户的新数据列表。当前 fetchUser 被调用并刷新页面,但在刷新之前我看不到新添加的用户。
const createuser = functions.httpsCallable('createuser');
const createNewUser = () => {
createuser({
phoneNumber: "+1111111111111",displayName: "test",introduction: "testcreate",})
.then((res) => {
fetchUser(); // fetchUser just fetches user data from firestore and rerenders page
})
.catch((err) => {
console.log(err);
});
};
总而言之,我能知道云功能何时完成其工作并运行特定功能或任务吗?
解决方法
看起来您没有正确返回承诺,因此函数在文档更新之前终止。请尝试添加如下所示的返回语句。
exports.createUser = functions
.https.onCall((data,context) => {
return admin.auth().createUser({
phoneNumber: data.phoneNumber,displayName: data.displayName,}).then(async (user) => {
// store data in firestore
await admin.firestore().collection("user").doc(user.uid).set({...data});
return {data: user.uid}
}).catch((err) => {
// handle error
return {error: error}
});
});
那么理想情况下,您应该在所有承诺都得到解决(即文档更新)后收到回复。还要确保您没有启用 Firestore 本地缓存。
,正如您将在 official Firebase video series 中关于“JavaScript Promises”的三个视频中看到的那样,当所有异步操作完成时,您必须在后台触发、Pub/Sub 或 Callable Cloud 函数中返回一个 Promise 或值.
这有两个相互关联的效果:
- 异步操作完成后,它会向 Cloud Function 平台表明它可以终止并清理您的函数。
- 相反,在异步操作完成之前,它向 Cloud Function 平台表明它应该在终止 Cloud Function 之前等待。
要返回 Promise,由于您链接了多个异步 Firebase Admin SDK 方法(返回 Promise),您需要按如下方式返回 Promise chain:
exports.createUser = functions.https.onCall((data,context) => {
return admin // <== See return here
.auth()
.createUser({
phoneNumber: data.phoneNumber,})
.then((user) => {
// store data in firestore
return admin // <== See return here
.firestore()
.collection('user')
.doc(user.uid)
.set({ ...data });
})
.then(() => {
// The set() method returns Promise<void>
// To send data back to the client,return data that can be JSON encoded
return { result: 'user created' };
})
.catch(error => {
// See https://firebase.google.com/docs/functions/callable#handle_errors
// on how to handle errors
});
});
这样,当您的前端返回 Callable Cloud Function 响应时,您就可以确定创建了用户和 Firestore 文档。
如果要使用 async/await
关键字,请执行以下操作。请注意,不建议将 then()
与 async/await
混淆。
exports.createUser = functions
.https.onCall(async (data,context) => { // <== See async here
try {
const user = await admin.auth().createUser({
phoneNumber: data.phoneNumber,});
await admin.firestore().collection("user").doc(user.uid).set({ ...data });
return { result: 'user created' }
} catch (error) {
console.log(error); // If desired
// See https://firebase.google.com/docs/functions/callable#handle_errors
// on how to handle errors
}
});
看看代码如何更具可读性,就像它是同步代码一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。