Доступ к Firestore через облачную функцию - PullRequest
0 голосов
/ 01 мая 2019

Итак, у меня есть 2 облачных функции в одном файле:

exports.Auth = functions.region('europe-west1').https.onRequest((req, res) =>

и

exports.IPN = functions.region('europe-west1').https.onRequest((req, res) =>

При добавлении следующего кода прямо в начале моей функции аутентификации он добавляет новый документ в Firestore, как и ожидалось, однако, когда я добавляю тот же код в начале моей функции IPN, которая в настоящее время вызывается через Paypal's IPN Simulator, ничего не делает, ошибок нет.

  let pin = RandomPIN(10, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
  var userRef = db.collection('Users').doc(pin);
  var setWithOptions = userRef.set({ Activated: false }, { merge: true });
  console.log("PIN: "+pin);

Что происходит, я что-то упускаю?

Заранее спасибо.

Обновление:

Вот журналы, сначала с двумя закомментированными средними строками, а затем без комментариев enter image description here Кажется, что он молча терпит неудачу, я просто не уверен, что его вызывает.

Обновление с полной функцией:

exports.IPN = functions.region('europe-west1').https.onRequest((req, res) =>
{
  console.log("IPN Notification Event Received");

  let pin = RandomPIN(10, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');
  var userRef = db.collection('Users').doc(pin);
  var setWithOptions = userRef.set({ Activated: false }, { merge: true });
  console.log("PIN: "+pin);

  if (req.method !== "POST")
  {
    console.error("Request method not allowed.");
    res.status(405).send("Method Not Allowed");
  }
  else
  {
    console.log("IPN Notification Event received successfully.");
    res.status(200).end();
  }

  let ipnTransactionMessage = req.body;
  // Convert JSON ipn data to a query string since Google Cloud Function does not expose raw request data.
  let formUrlEncodedBody = querystring.stringify(ipnTransactionMessage);
  // Build the body of the verification post message by prefixing 'cmd=_notify-validate'.
  let verificationBody = `cmd=_notify-validate&${formUrlEncodedBody}`;

  console.log(`Verifying IPN: ${verificationBody}`);

  let options = {
    method: "POST",
    uri: getPaypalURI(),
    body: verificationBody,
  };

  // POST verification IPN data to paypal to validate.
  request(options, function callback(error, response, body)
  {
    if(!error && response.statusCode === 200)
    {
      if(body === "VERIFIED")
      {
        console.log(`Verified IPN: IPN message for Transaction ID: ${ipnTransactionMessage.txn_id} is verified.`);
        SendPIN(ipnTransactionMessage.payer_email, pin);
      }
      else if(body === "INVALID")
        console.error(`Invalid IPN: IPN message for Transaction ID: ${ipnTransactionMessage.txn_id} is invalid.`);
      else
        console.error("Unexpected reponse body.");
    }
    else
    {
      console.error(error);
      console.log(body);
    }
  });
});

1 Ответ

1 голос
/ 01 мая 2019

Действительно, это проблема цепочки Promises, а также проблема из-за библиотеки request: request изначально поддерживает интерфейсы обратного вызова, но не возвращает обещание, что вы должны делать в облачной функции.

Я бы посоветовал вам посмотреть официальные видео Firebase от Дуга: https://www.youtube.com/watch?v=7IkUgCLr5oA&t=28s и https://www.youtube.com/watch?v=652XeeKNHSk, которые объясняют эту ключевую концепцию.

Вы можете использовать request-promise (https://github.com/request/request-promise) и метод rp(), который «возвращает обычное обещание / совместимое обещание +» +

Не ясно, что делает SendPIN(). Давайте сделаем предположение, что он возвращает Обещание. Если это так, вы можете адаптировать свой код следующим образом:

//....
const rp = require('request-promise');
//....

exports.IPN = functions.region('europe-west1').https.onRequest((req, res) => {
  console.log('IPN Notification Event Received');

  let pin = RandomPIN(
    10,
    '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
  );
  var userRef = db.collection('Users').doc(pin);

  if (req.method !== 'POST') {
    console.error('Request method not allowed.');
    res.status(405).send('Method Not Allowed');
  } else {
    let ipnTransactionMessage;
    userRef
      .set({ Activated: false }, { merge: true })
      .then(() => {
        console.log('PIN: ' + pin);
        ipnTransactionMessage = req.body;
        // Convert JSON ipn data to a query string since Google Cloud Function does not expose raw request data.
        let formUrlEncodedBody = querystring.stringify(ipnTransactionMessage);
        // Build the body of the verification post message by prefixing 'cmd=_notify-validate'.
        let verificationBody = `cmd=_notify-validate&${formUrlEncodedBody}`;

        console.log(`Verifying IPN: ${verificationBody}`);

        let options = {
          method: 'POST',
          uri: getPaypalURI(),
          body: verificationBody
        };
        // POST verification IPN data to paypal to validate.
        return rp(options);
      })
      .then(response => {
        //Not sure what you will get within the response object...
        console.log(
          `Verified IPN: IPN message for Transaction ID: ${
            ipnTransactionMessage.txn_id
          } is verified.`
        );
        return SendPIN(ipnTransactionMessage.payer_email, pin); //It is not clear what SendPIN is doing, let's make the assumption it returns a Promise...
      })
      .then(() => {
        res.send('Success');
        return null;
      })
      .catch(err => {
        console.error(
          `Invalid IPN: IPN message for Transaction ID: ${
            ipnTransactionMessage.txn_id
          } is invalid.`
        );
        res
          .status(500)
          .send(
            'Error: ' +
              err +
              ` - Invalid IPN: IPN message for Transaction ID: ${
                ipnTransactionMessage.txn_id
              } is invalid.`
          );
        return null;
      });
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...