如何在云函数中调用云函数并包含数据



我正在尝试调用云函数"startTimer";从另一个云函数和包括数据,同时调用函数";startTimer";

例如,在我的客户端,很容易调用函数";startTimer";并通过写入以下内容(颤动代码(包括数据:

HttpsCallable callable = FirebaseFunctions.instance.httpsCallable('startTimer');
callable.call({"gameId": MyFirebase.gameId});

然后我能够在我的云功能"中检索数据;startTimer";通过执行以下操作:

exports.startTimer = functions.https.onCall(async (data, context) => {
const gameId = data.gameId;

我怎样才能调用函数";startTimer";在另一个云功能中并包含数据(gameId(?此外,我该如何做到这一点,以便数据的格式/结构与上面的代码片段(data.gameId(完全相同?我试过这样的东西,但它不起作用:

fetch("https://{LOCATION}-{PROJECT-ID}.cloudfunctions.net/startTimer", {
method: "POST",
body: JSON.stringify({"gameId": gameId}),)};

"获取";来自const fetch = require("node-fetch");

我对javascript/typescript还很陌生,所以非常感谢任何帮助/参考:(提前谢谢!

除了@Renaud的,您还可以使用Google Cloud Tasks来调用HTTP函数。这样做的主要好处是,您可以返回第一个函数的响应,而无需等待第二个函数的完成。这是一件小事,但我发现它在很多情况下都很有用。

您可以将您可能需要的任何数据传递到GCloud任务的主体,这样您就不必再次从第二个函数调用数据库。

exports.firstFunctions = functions.https.onCall(async (data, context) => {
// Functions logic
await addCloudTask(/*params*/)
//Return the response
})

const addCloudTask = async (queue, url, method, inSeconds, body) => {
const project = "<project-id>"
const location = "us-central1"
const parent = gCloudClient.queuePath(project, location, queue)
const [response] = await gCloudClient.createTask({
parent,
task: {
httpRequest: {
httpMethod: method,
url,
body: Buffer.from(JSON.stringify({body})).toString("base64"),
headers: {
"Content-Type": "application/json"
}
},
scheduleTime: {
seconds: inSeconds + (Date.now() / 1000)
}
}
});
return
}  

您还可以传递inSeconds参数来为回调添加任何延迟。

我可以看到两种可能性:

1.按照协议将其称为HTTP端点

正如你在文档中所读到的;云功能的https.onCall触发器是HTTPS触发器,具有特定的请求和响应格式">

因此,您可以从另一个云函数调用可调用的云函数,例如Axios或fetch。

2.使用额外的发布/子云函数

您可以在一个函数中重构业务逻辑,该函数从两个云函数调用:现有的可调用云函数或Pub/Sub触发的云函数。大致如下,使用异步业务逻辑和async/await:

exports.startTimer = functions.https.onCall(async (data, context) => {
try {
const gameId = data.gameId;
const result = await asyncBusinessLogic(gameId);
return { result: result }
} catch (error) {
// ...
}
});
exports.startTimerByPubSubScheduler = functions.pubsub.topic('start-timer').onPublish((message) => {
try {
const gameId = message.json.gameId;
await asyncBusinessLogic(gameId);
return null;
} catch (error) {
// ...
return null;
}
});

async function asyncBusinessLogic(gameId) {

const result = await anAsynchronousJob(gameId);
return result;

}

相关内容

  • 没有找到相关文章