我正在使用Firestore的onCreate函数来检测用户注册并使用其用户ID创建文档。问题在于该功能有时可以正常工作,而其他时间则无法正常工作。另外,每当函数运行时,我总是收到“函数返回的未定义,期望的承诺或值”错误。我已经尝试过许多在类似问题上给出的解决方案,但是仍然没有运气。
export const createNewUser = functions.auth.user().onCreate(user => {
const userId = user.uid;
const updateData = {
ads_watched: 0,
coins: 20000,
gems: 0
};
admin.firestore().doc("cashon/" + userId)
.set(updateData)
.then(writeResult => {
console.log("User Created result:", writeResult);
return null;
})
.catch(err => {
console.log(err);
return null;
});
});
答案 0 :(得分:1)
您需要返回set()
异步方法返回的promise,如下所示:
export const createNewUser = functions.auth.user().onCreate(user => {
const userId = user.uid;
const updateData = {
ads_watched: 0,
coins: 20000,
gems: 0
};
return admin.firestore().doc("cashon/" + userId)
.set(updateData)
.then(() => {
console.log("User Created result:", writeResult);
return null;
})
.catch(err => {
console.log(err);
return null;
});
});
如“函数返回未定义的,预期的承诺或值”错误所示,您必须在后台触发的Cloud Function中返回Promise或值,以向平台指示Cloud Function已完成。由于您未返回Promise,因此会遇到这种不一致的行为:有时,Cloud Function在平台写入Firestore之前就被平台杀死了。
我建议您观看道格·史蒂文森(https://firebase.google.com/docs/functions/video-series/)的Firebase视频系列中有关“ JavaScript承诺”的3个视频,它们解释了这一关键点。
还要注意,set()
方法返回一个Promise<void>
。
最后,请注意,如果不需要console.log("User Created result:", writeResult);
,则可以执行以下操作:
export const createNewUser = functions.auth.user().onCreate(user => {
const userId = user.uid;
const updateData = {
ads_watched: 0,
coins: 20000,
gems: 0
};
return admin.firestore().doc("cashon/" + userId)
.set(updateData)
.catch(err => {
console.log(err);
return null;
});
});