异步 https firebase 函数
Asynchronous https firebase functions
HTTPS 函数 return 像实时函数这样的异步承诺必须如此吗?
我们还没有 return 使用 HTTPS 函数(仅使用 res.status.send 等),看起来 firebase/function-samples 也不是。但是文档有点模棱两可 https://firebase.google.com/docs/functions/terminate-functions .
您的云函数应 return"end" 具有以下任一
res.redirect(), res.send(), or res.end()
他们所说的 returning 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();
});
});
}
HTTP 函数目前不遵守 returned 承诺 - 它们需要发送结果才能正常终止。如果 HTTP 函数没有发送结果,它将超时。
所有其他类型的函数都需要 returned promise 才能等待异步工作完全完成。
如果您没有任何异步工作要等待,您可以立即return。
这些是文档中概述的三种情况。
环顾四周后,这是一个 Promise
的实现,对我来说 return 来自 Google Cloud Function 的值,该函数需要 [=14] =] 异步调用:
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);
});
});
});
现在可以在最新的 Firebase 中使用:
exports.asyncFunction = functions.https.onRequest(async (request, response) => {
const result = await someAsyncFunction();
response.send(result);
});
HTTPS 函数 return 像实时函数这样的异步承诺必须如此吗? 我们还没有 return 使用 HTTPS 函数(仅使用 res.status.send 等),看起来 firebase/function-samples 也不是。但是文档有点模棱两可 https://firebase.google.com/docs/functions/terminate-functions .
您的云函数应 return"end" 具有以下任一
res.redirect(), res.send(), or res.end()
他们所说的 returning 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();
});
});
}
HTTP 函数目前不遵守 returned 承诺 - 它们需要发送结果才能正常终止。如果 HTTP 函数没有发送结果,它将超时。
所有其他类型的函数都需要 returned promise 才能等待异步工作完全完成。
如果您没有任何异步工作要等待,您可以立即return。
这些是文档中概述的三种情况。
环顾四周后,这是一个 Promise
的实现,对我来说 return 来自 Google Cloud Function 的值,该函数需要 [=14] =] 异步调用:
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);
});
});
});
现在可以在最新的 Firebase 中使用:
exports.asyncFunction = functions.https.onRequest(async (request, response) => {
const result = await someAsyncFunction();
response.send(result);
});