HTTPS 可调用云函数不返回值
Https callable cloud function not returning value
我有一个 Flutter 应用程序,我正在尝试从 braintree 获取客户端随机数。根据 braintree documentation,我的云函数中有这个:
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 应用程序中调用函数(同样,我遵循 plugin says):
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');
}
}
我尝试更改云函数,使其仅 return 是一个随机数(函数一执行),我的 Flutter 应用程序正确接收该值(因此云函数通信正常).在我的 Firebase 控制台中,我能够查看 console.log
指定的客户端随机数。但是该函数出于某种原因无法 return 实际的客户端随机数。 (应该是一些长度 >2000 个字符的字符串散列)
可调用函数需要 return 来自函数回调顶层的承诺,该承诺将值解析为 return。现在,您 return 从顶层什么也没有。您现在拥有的 return 只是 return 从传递给 braintree API 的内部回调函数中获取一个值。这不会传播到顶层。
您需要做的是使用 return 一个 API(如果存在)的 braintree 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);
}
});
});
});
我有一个 Flutter 应用程序,我正在尝试从 braintree 获取客户端随机数。根据 braintree documentation,我的云函数中有这个:
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 应用程序中调用函数(同样,我遵循 plugin says):
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');
}
}
我尝试更改云函数,使其仅 return 是一个随机数(函数一执行),我的 Flutter 应用程序正确接收该值(因此云函数通信正常).在我的 Firebase 控制台中,我能够查看 console.log
指定的客户端随机数。但是该函数出于某种原因无法 return 实际的客户端随机数。 (应该是一些长度 >2000 个字符的字符串散列)
可调用函数需要 return 来自函数回调顶层的承诺,该承诺将值解析为 return。现在,您 return 从顶层什么也没有。您现在拥有的 return 只是 return 从传递给 braintree API 的内部回调函数中获取一个值。这不会传播到顶层。
您需要做的是使用 return 一个 API(如果存在)的 braintree 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);
}
});
});
});