【问题标题】:Https callable cloud function not returning valueHttps可调用云函数不返回值
【发布时间】:2020-02-04 08:24:48
【问题描述】:

我有一个 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');
    }
}

我尝试更改云函数,使其仅返回一个随机数(函数一执行),并且我的 Flutter 应用程序正确接收该值(因此云函数通信正常)。在我的 Firebase 控制台中,我可以查看console.log 指定的客户端随机数。但是该函数由于某种原因无法返回实际的客户端随机数。 (应该是一些长度大于 2000 个字符的字符串哈希)

【问题讨论】:

  • 首先要确保您的项目采用付费计划,因为在免费计划中您只能调用 Google 托管的服务。

标签: javascript node.js flutter google-cloud-functions braintree


【解决方案1】:

可调用函数需要从函数回调的顶层返回一个promise,该函数用要返回的值解析。现在,您没有从顶层返回任何内容。您现在的返回只是从您传递给 Braintree API 的内部回调函数返回一个值。这不会传播到顶层。

您需要做的是要么使用返回 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);
            }
        });
    });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    • 2021-01-24
    • 2021-03-07
    • 2021-06-03
    • 2021-12-06
    • 2020-01-02
    • 1970-01-01
    相关资源
    最近更新 更多