gpt4 book ai didi

node.js - Node/Firebase onCall 异步函数返回

转载 作者:搜寻专家 更新时间:2023-10-31 23:03:04 25 4
gpt4 key购买 nike

用户在聊天客户端(网站)中键入一条消息。此消息将发送到在 firebase 上设置的云功能。云函数然后查询返回响应的第 3 方 API。此响应需要发送回客户端以显示。

所以基本上我的客户会像这样调用云函数...

var submitMessage = firebase.functions().httpsCallable('submitMessage');
submitMessage({message: userMessage}).thenfunction(result) {
//Process result
});

我的云函数看起来像这样......

exports.submitMessage = functions.https.onCall((data, context) => {
request({
url: URL,
method: "POST",
json: true,
body: queryJSON //A json variable I've built previously
}, function (error, response, body) {
//Processes the result (which is in the body of the return)
});

return {response: "Test return"};
});

我已经包含了请求包并且 API 调用本身运行良好。我可以从请求的返回函数中将结果打印到控制台。但是,显然因为请求是异步的,所以我不能只创建一个全局变量并将结果主体分配给它。我已经看到您可以在请求完成后调用回调函数。但是,我需要以某种方式将其传递给云函数返回值。简而言之,我需要这样做...

exports.submitMessage = functions.https.onCall((data, context) => {

var gBody;

request({
url: URL,
method: "POST",
json: true,
body: queryJSON //A json variable I've built previously
}, function (error, response, body) {
gBody = body;
});

return gBody;
});

(是的,我知道这篇文章... How do I return the response from an asynchronous call? 但正如我所说,我需要变量范围在云函数本身内,以便我能够将值返回给客户端。要么我不明白该帖子中使用的方法,或者它没有完成我的要求)

最佳答案

你最后一段中的方法行不通:当你的 return gBody 运行时,来自第 3 方 API 的回调还没有被调用,所以 gBody 是空的。

正如 Cloud Functions 文档所说:

To return data after an asynchronous operation, return a promise. The data returned by the promise is sent back to the client.

因此您只需返回一个 promise ,然后使用来自第 3 方 API 的数据解决该 promise 。

exports.submitMessage = functions.https.onCall((data, context) => {
return new Promise(function(resolve, reject) {
request({
url: URL,
method: "POST",
json: true,
body: queryJSON //A json variable I've built previously
}, function (error, response, body) {
if (error) {
reject(error);
}
else {
resolve(body)
}
});
});
});

关于node.js - Node/Firebase onCall 异步函数返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com