Функция вызываемого облака Https не возвращает значение - PullRequest
0 голосов
/ 07 октября 2019

У меня есть приложение 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 символов)

1 Ответ

1 голос
/ 07 октября 2019

Вызываемая функция должна возвращать обещание из верхнего уровня обратного вызова функции, которое разрешается со значением, которое необходимо вернуть. Прямо сейчас вы ничего не возвращаете с верхнего уровня. Возврат, который вы получили сейчас, это просто возвращение значения из внутренней функции обратного вызова, которую вы передаете в Braintree API. Это не будет распространяться на верхний уровень.

Вам нужно либо использовать версию API Braintree, которая возвращает API (если она существует), либо обещать существующий вызов, который использует обратный вызов.

См. также «3. Обратный вызов в стиле узла» здесь: Как преобразовать существующий API обратного вызова в обещания?

У меня нетпроверил это, но общий формат, если вы примените этот шаблон, будет выглядеть примерно так:

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);
            }
        });
    });
});
...