最新消息: 电脑我帮您提供丰富的电脑知识,编程学习,软件下载,win7系统下载。

Https可调用云函数不返回值

IT培训 admin 6浏览 0评论

Https可调用云函数不返回值

我有一个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个字符长的字符串哈希)

回答如下:

可调用函数需要从函数回调的顶层返回一个承诺,并以返回的值进行解析。目前,您没有从顶层返回任何信息。现在的返回结果只是从传递给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);
            }
        });
    });
});

Https可调用云函数不返回值

我有一个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个字符长的字符串哈希)

回答如下:

可调用函数需要从函数回调的顶层返回一个承诺,并以返回的值进行解析。目前,您没有从顶层返回任何信息。现在的返回结果只是从传递给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);
            }
        });
    });
});

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论