Функция Firebase Cloud не может написать документ после использования PayPal SDK - PullRequest
0 голосов
/ 11 октября 2019

У меня проблемы с этой функцией после вызова PayPal-функции get order. Он успешно получает детали заказа и записывает его в консоль. Однако после этого он должен писать в документ Firestore, но не делает этого. В журнале функций нет ошибки только в том, что он запустил и выполнил функции. Если я уберу функцию PayPal, она сможет писать в документы, чтобы я знал, что код работает. Я просто не знаю, что я испортил. Любая помощь будет оценена, спасибо.

const functions = require('firebase-functions');
// Import and initialize the Firebase Admin SDK.
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const paypal = require('paypal-rest-sdk');

paypal => configured here 


exports.createRecord = functions.firestore.document('messages/{messageId}').onCreate(
async (snapshot) => {


      var orderId = "3L62701538009611M";

      paypal.order.get(orderId, function (error, order) {
         if (error) {
            console.log(error);
            return false;

         } else {
            console.log("Get Order Response",JSON.stringify(order));

            var userObject = {
                 displayName : 'BarryAllen',
                 email : 'FMA@Speedster.com',
             };

           return admin.firestore().doc('paid/docnametest').set(userObject)

    }

   });


 });

журналы функций

5:25:50.643 PM
checkWork
Function execution took 3559 ms, finished with status: 'ok'
5:25:47.516 PM
createRecord
Function execution took 236 ms, finished with status: 'ok'
5:25:47.281 PM
createRecord
Function execution started
5:25:47.085 PM
checkWork
Function execution started

1 Ответ

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

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

Что вам нужно будет сделать, это " promisify " вызов PayPal, поскольку они в настоящее времяне поддерживать обещания (если вы не хотите использовать их бета-версию 2.0).

Если вы обещаете, это будет выглядеть примерно так, что вы, вероятно, захотите изменить в зависимости от того, что вы действительно хотите сделать сответ от PayPal:

const p = new Promise((resolve, reject)) => {
    paypal.order.get(orderId, function (error, order) {
        if (error) {
            console.log(error);
            reject(error);
        } else {
            console.log("Get Order Response",JSON.stringify(order));
            resolve(order);
        }
    }
})
return p.then(order => {
    var userObject = {
        displayName : 'BarryAllen',
        email : 'FMA@Speedster.com',
    };

    return admin.firestore().doc('paid/docnametest').set(userObject).then
})
...