Я понимаю, что эта облачная функция 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-триггерами в облачных функциях ".