我有一个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个字符)
console.log
可调用函数需要从函数回调的顶层返回一个承诺,并以返回的值进行解析。目前,您没有从顶层返回任何信息。现在的返回值只是从传递给Braintree API的内部回调函数返回一个值。这不会传播到顶层。
您需要做的是要么使用Braintree API的版本返回API(如果存在),要么使使用回调的现有调用合理化。
另请参见“ 3.节点样式回调”:如何将现有的回调API转换为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); } }); }); });