用户在聊天客户端(网站)中键入消息。此消息将发送到在Firebase上设置的云功能。然后,云功能查询返回响应的第三方API。此响应需要发送回客户端以显示。
所以基本上我的客户像这样调用云函数...
awk
我的云功能看起来像这样...
$ awk -F= 'NR==FNR {a[$1]=$2; next}
$1 in a {if(a[$1]!=$2) print $1 FS a[$1] "\t!" $0;
delete a[$1]; next}
{print " \t>" $0}
END {for(k in a) print ">" k"="a[k]}' f1 f2 | column -ts$'\t'
emcas_fin_bi=324 !emcas_fin_bi=333
emcas_fin_drr=3294 !emcas_fin_drr=5528
emcas_fin_exp=887 !emcas_fin_exp=1134
>emcas_fin_revpro=0
emcas_gbo_gs=3077 !emcas_gbo_gs=3897
我已包含请求包,并且API调用本身可以完美运行。我可以从请求的返回函数中将结果打印到控制台。但是,显然因为请求是异步的,所以我不能只创建一个全局变量并将结果主体分配给它。我已经看到,请求完成后就可以调用回调函数。但是,我需要以某种方式将其传递给云函数的返回值。简而言之,我需要这样做...
var submitMessage = firebase.functions().httpsCallable('submitMessage');
submitMessage({message: userMessage}).thenfunction(result) {
//Process result
});
(是的,我知道这篇文章... How do I return the response from an asynchronous call?,但是是的,正如我所说,我需要变量作用域位于云函数本身内,以便能够将值返回给客户端。要么我不理解该帖子中使用的方法,要么就不能满足我的要求。
答案 0 :(得分:2)
最后一个代码段中的方法无效:到return gBody
运行来自第三方API的回调时,尚未调用,因此gBody
为空。
如Cloud Functions文档所述:
要在异步操作后返回数据,请返回promise。 Promise返回的数据将发送回客户端。
因此,您只需返回一个承诺,然后再使用来自第三方API的数据来解决该承诺。
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)
}
});
});
});