javascript - Https可调用云函数不返回值
问题描述
我有一个 Flutter 应用程序,我正在尝试从 Braintree 获取客户端随机数。根据Braintree 文档,我的云功能中有这个:
exports.getClientNonce = functions.https.onCall(async (data, context) => {
gateway.clientToken.generate({}, function (err, response) {
if (err) {
throw new functions.https.HttpsError('unknown', 'Error getting client nonce');
} else {
console.log(`token: ${response.clientToken}`);
return response.clientToken;
}
});
});
然后,在我的 Flutter 应用程序中,我调用了该函数(同样,我正在关注插件所说的内容):
try {
HttpsCallable callable = CloudFunctions.instance.getHttpsCallable(
functionName: 'getClientNonce',
);
dynamic result = await callable.call({});
final value = result.data;
debugPrint('token: $value');
var data = await BraintreePayment().showDropIn(
nonce: value,
amount: '2.0',
enableGooglePay: false,
inSandbox: true);
print("Response of the payment $data");
} on CloudFunctionsException catch (e) {
debugPrint('An error occurred');
} catch (e) {
debugPrint('An error occurred');
}
}
我尝试更改云函数,使其仅返回一个随机数(函数一执行),并且我的 Flutter 应用程序正确接收该值(因此云函数通信正常)。在我的 Firebase 控制台中,我可以查看由console.log
. 但是该函数由于某种原因无法返回实际的客户端随机数。(应该是一些长度大于 2000 个字符的字符串哈希)
解决方案
可调用函数需要从函数回调的顶层返回一个promise,该函数用要返回的值解析。现在,您没有从顶层返回任何内容。您现在的返回只是从您传递给 Braintree API 的内部回调函数返回一个值。这不会传播到顶层。
您需要做的是使用返回 API(如果存在)的 Braintree API 版本,或者承诺使用回调的现有调用。
另请参阅此处的“3. 节点样式回调”:如何将现有的回调 API 转换为 Promise?
我没有对此进行测试,但是如果您应用该模式,一般格式将看起来更像这样:
exports.getClientNonce = functions.https.onCall(async (data, context) => {
return new Promise((resolve, reject) => {
gateway.clientToken.generate({}, function (err, response) {
if (err) {
reject(new functions.https.HttpsError('unknown', 'Error getting client nonce'));
} else {
console.log(`token: ${response.clientToken}`);
resolve(response.clientToken);
}
});
});
});
推荐阅读
- unit-testing - 资源之间唯一关系中的单元测试
- ios - 重新排列 MediaPlayer 音乐队列 [iOS]
- javascript - 该代码中标记和扫描的结果是什么?
- python - 从python中的文本文件解析函数
- javascript - 热门通过反应获得角色
- javascript - Javascript函数范围和执行上下文
- youtube - Youtube 嵌入链接 - 删除标题,稍后观看,分享链接?
- gnuplot - gnuplot 空 y 范围/在 0 处绘制数据
- winforms - 在 Windows 窗体应用程序中输入缓慢的问题
- android - WebRTC如何在Android中静音本地音频播放?