Функция узла JS не выполняется.Что может быть причиной? - PullRequest
0 голосов
/ 22 мая 2018

Я хочу получить платеж и сразу же создать перевод для платежа с помощью облачных функций Firebase.Захват происходит правильно, но передача не выполняется.В чем может быть причина?

Документы для справки: https://github.com/razorpay/razorpay-node/blob/master/examples/index.js

Ниже приведен исходный код моей функции Firebase Cloud:

   exports.CapturePayment = functions.database.ref('payment_id').onWrite((event) => {

  const payment_id = event.data.val();

  // Capture a particular payment
rzp.payments.capture(payment_id, 100000).then((data) => {

  return event.data.ref.child('status').set(data);
  console.log(data);

  // Create transfers on a payment
rzp.payments.transfer(payment_id, {
  transfers: [
    {
      account: 'acc_aldsfkas123123adsf',
      amount: 100,
      currency: 'INR'
    }
  ]
}).then((data) => {
  var db = admin.database();
  var ref = db.ref("transfer");
  return ref.update("Success");
   console.log(data)

}).catch((error) => {
  var db = admin.database();
  var ref = db.ref("transfer");
  return ref.update("Failure");
   console.error(error)
})

  // success
}).catch((error) => {
  console.log(error);

  // error
})

});

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Если вы хотите вернуть данные при первоначальном вызове, но также выполнить перевод, просто измените его на следующее:

// Capture a particular payment
rzp.payments.capture(payment_id, 100000).then((data) => {
  const ret = event.data.ref.child('status').set(data);
  console.log(data)

  // Create transfers on a payment
  rzp.payments.transfer(payment_id, {
    transfers: [
      {
        account: 'acc_aldsfkas123123adsf',
        amount: 100,
        currency: 'INR'
      }
    ]
  })

  return ret
})

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

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


Действительно, вы должны разбить все свои асинхронные работы на одну порцию и понятные функции, которые можно объединить в цепочку для лучшей читаемости.Например, ваша цепочка может выглядеть так:

capturePayment(payment_id, 100000)
  .then(updateDB)
  .then(transfer)
  .then(data => console.log('success'))
  .catch(err => console.error(err))

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

0 голосов
/ 22 мая 2018

У вас есть оператор возврата в первой строке функции в вашем первом, а затем вызове метода.Весь код, который идет после этого, не выполняется, следовательно, передача не выполняется.

rzp.payments.capture(payment_id, 100000).then((data) => {

  return event.data.ref.child('status').set(data);

  /* NO CODE AFTER THE RETURN STATEMENT IS EXECUTED */
  console.log(data);

  // Create transfers on a payment
  rzp.payments.transfer(payment_id, {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...