Сохранить переменную между обещаниями в функции? - PullRequest
1 голос
/ 16 октября 2019

В функции Firebase мне нужно получить данные от Paypal и сделать 4 вещи:

1. returns an empty HTTP 200 to them.
2. send the complete message back to PayPal using `HTTPS POST`.
3. get back "VERIFIED" message from Paypal.
4. *** write something to my Firebase database only here.

Что я делаю сейчас работает , но у меня проблема с (4).

   exports.contentServer = functions.https.onRequest((request, response) => {
....

                       let options = {
                          method: 'POST',
                          uri: "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr",
                          body: verificationBody
                           };

                           // ** say 200 to paypal
                           response.status(200).end();

                           // ** send POST to paypal back using npm request-promise
                           return rp(options).then(body => {

                            if (body === "VERIFIED") {

                              //*** problem is here!
                                   return admin.firestore().collection('Users').add({request.body}).then(writeResult => {return console.log("Request completed");});
                                }
                                return console.log("Request completed");
                              })
                              .catch(error => {
                                      return console.log(error);
                              })

Как вы можете видеть, когда я получаю окончательный ПРОВЕРЕНО от Paypal, я пытаюсь записать в БД с admin.firestore().collection('Users')..

Я получаю предупреждение при компиляции:

Avoid nesting promises 

для строки write.

Как и где мне поставить это write на этой стадии обещания?

1 Ответ

2 голосов
/ 16 октября 2019

Я понимаю, что эта облачная функция HTTPS вызывается из Paypal.

Делая response.status(200).end(); в начале своей облачной функции HTTP , вы прекращаете ее , как объяснено в doc :

Внимание! Убедитесь, что все функции HTTP завершены правильно. Правильно завершая функции, вы можете избежать чрезмерных расходов от функций, которые работают слишком долго. Завершите функции HTTP с помощью res.redirect(), res.send() или res.end().

Это означает, что в большинстве случаев остальная часть кода не будет выполнена вообще или функция будет завершена всередина асинхронной работы (т. е. методы rp() или add())

Вы должны отправлять ответ вызывающей стороне только после завершения всей асинхронной работы. Должно работать следующее:

exports.contentServer = functions.https.onRequest((request, response) => {

    let options = {
        method: 'POST',
        uri: "https://ipnpb.sandbox.paypal.com/cgi-bin/webscr",
        body: verificationBody
    };

    // ** send POST to paypal back using npm request-promise
    return rp(options)
        .then(body => {

            if (body === "VERIFIED") {
                //*** problem is here!
                return admin.firestore().collection('Users').add({ body: request.body });
            } else {
                console.log("Body is not verified");
                throw new Error("Body is not verified");
            }

        })
        .then(docReference => {
            console.log("Request completed");
            return response.send({ result: 'ok' }); //Or any other object, or empty
        })
        .catch(error => {
            console.log(error);
            return response.status(500).send(error);
        });


});

Я бы посоветовал вам посмотреть официальную серию видео по облачным функциям от Дуга Стивенсона (https://firebase.google.com/docs/functions/video-series/) и, в частности, первое видео на Promises под названием «Изучите обещания JavaScript (Часть 1) с HTTP-триггерами в облачных функциях ".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...