我有一个Flutter应用程序,我正在尝试从braintree获得客户随机数。根据{{3}},我在我的云函数中有此功能:
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应用中,我调用该函数(再次,我遵循braintree documentation的内容):
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个字符)
答案 0 :(得分:1)
可调用函数需要从函数回调的顶层返回一个承诺,并以返回的值进行解析。目前,您没有从顶层返回任何信息。现在的返回结果只是从传递给braintree API的内部回调函数返回一个值。这不会传播到顶层。
您需要做的是使用Braintree API版本返回API(如果存在),或者promisify使用回调的现有调用。
另请参见“ 3.节点样式回调”:How do I convert an existing callback API to promises?
我还没有测试过,但是如果您应用该模式,则通用格式将更像这样:
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);
}
});
});
});