HTTPS函数是否应该像实时函数一样返回异步承诺? 我们还没有在HTTPS函数中返回(只使用res.status.send等),而且看起来firebase / function-samples也不是。但文档略显含糊https://firebase.google.com/docs/functions/terminate-functions。
答案 0 :(得分:6)
HTTP函数当前不尊重返回的promise - 它们需要发送结果才能正常终止。如果HTTP函数没有发送结果,它将超时。
所有其他类型的函数都需要返回的promise,以便等待异步工作完全完成。
如果您没有等待的异步工作,您可以立即返回。
这些是文档中概述的三个案例。
答案 1 :(得分:0)
您的云功能应使用以下任一方式返回“结束”
res.redirect(),res.send()或res.end()
返回promises意味着什么,让我们假设您有一个更新实时数据库中的节点的云功能,您希望在响应HTTP请求之前完成该工作。
示例代码
let RemoveSomething = functions.https.onRequest((req, res) => {
cors(req, res, () => {
// Remove something
DoDatabaseWork()
.then(function (result) {
res.status(200).send();
})
.catch(function (err) {
console.error(err);
res.status(501).send();
});
});
});
更新:添加了DoDatabaseWork示例。
const DoDatabaseWork = function () {
return new Promise(function (resolve, reject) {
// Remove SomeNode
admin.database().ref('/someNode/').remove()
.then(function (result) {
resolve();
})
.catch(function (err) {
console.error(err);
reject();
});
});
}
答案 2 :(得分:0)
经过深思熟虑后,这是一个Promise
实现的实现,我可以从Google Cloud函数中返回一个值,该函数需要进行第三方异步调用:
exports.getSomeAccessToken = functions.https.onCall((data, context) => {
var dataStr = JSON.stringify(data, null, '\t');
console.log('ENTER [getSomeAccessToken], got dataStr: ' + dataStr);
return new Promise((resolve, reject) => {
gateway.clientToken.generate({}, function (err, gatewayResponse) {
var result = {
clientToken: gatewayResponse.clientToken
};
var resultStr = JSON.stringify(result, null, '\t');
console.log("resultStr : " + resultStr);
resolve(result);
});
});
});
答案 3 :(得分:0)
现在可以在最新的Firebase中使用
:exports.asyncFunction = functions.https.onRequest(async (request, response) => {
const result = await someAsyncFunction();
response.send(result);
});