firebase可调用函数的返回值



我很难使用可调用的firebase函数返回值,而当它是一个httprequest时,相同的代码工作得很好。

因此,我正在做的是获取一些用户数据,然后获取一些其他数据(船只列表),然后仅返回用户具有编辑权限的船只。我非常确定accessibleVessels对象持有一些json数据:我在functions.https.onRequestfirebase函数中更改了该函数,并且运行良好。

exports.getFormData = functions.https.onCall( (data, context) => {
const uid = context.auth?.uid.toString;
try {
const user = admin.firestore().
doc("users/"+uid)
.get().then((doc: any) => {
return doc.data();
});
const vessels = admin.firestore().
collection("vessels").get()
.then(mapSnapshot((doc: any) => doc.data()));
const accessibleVessels = vessels.filter((vessel: any) => {
return user.hasEditRights.some((right: any) => {
return vessel.name === right;
});
});

return accessibleVessels;
} catch (error) {
console.log(error);
return {"error": true};
}
});

当我运行这个时,我得到:

数据不能用JSON编码。(函数(匿名))

在文档中,我知道我确实需要返回json或承诺。我读了关于这个的其他答案(返回一个承诺),但不知道这在我的例子中是如何工作的:在例子中,我发现数据做得不多,它只是返回。我想把数据放在变量里而不是把所有的东西都串起来,这样我就可以把两者结合起来。我该怎么做呢?

修复此问题的最简单方法是使用async/await:

exports.getFormData = functions.https.onCall(async(data, context) => { // 👈
const uid = context.auth?.uid.toString;
try {
const user = await admin.firestore() // 👈
.doc("users/"+uid)
.get().then((doc: any) => {
return doc.data();
});
const vessels = await admin.firestore() // 👈
.collection("vessels").get()
.then(mapSnapshot((doc: any) => doc.data()));
const accessibleVessels = vessels.filter((vessel: any) => {
return user.hasEditRights.some((right: any) => {
return vessel.name === right;
});
});

return accessibleVessels;
} catch (error) {
console.log(error);
return {"error": true};
}
});

我还推荐阅读关于async/await的MDN文档,关于同步、异步和承诺的Firebase文档,以及Doug关于云函数中的JavaScript承诺的精彩系列。

最新更新