【问题标题】:Node JS function not being executed. What could be the reason?节点 JS 函数未执行。可能是什么原因?
【发布时间】:2018-10-31 19:57:35
【问题描述】:

我想使用 Firebase Cloud Functions 捕获付款并立即在付款上创建转帐。捕获正确进行,但未执行传输。可能是什么原因?

参考文档:https://github.com/razorpay/razorpay-node/blob/master/examples/index.js

以下是我的 Firebase Cloud Function 的源代码:

   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
})

});

【问题讨论】:

  • 您在转帐前返回。该代码永远不会运行。
  • rzp.payments.capture() 的第一行是回车。没有其他任何东西被执行。这只是一个错字吗?
  • 那我应该怎么改代码呢?
  • 不行,return返回一个json对象,里面有很多数据。看看这个:docs.razorpay.com/docs/v1paymentsidcapture

标签: node.js firebase firebase-realtime-database google-cloud-functions razorpay


【解决方案1】:

如果您想在初始调用中返回数据,同时也进行传输,只需将其更改为以下内容:

// 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))

那么您所要做的就是确保您的每个链接函数都采用一个参数,该参数可以从前一个的结果中传递。

【讨论】:

  • 我知道这超出了问题的范围,但是很难看到异步 set() 函数被这样调用并继续传输而不等待查看 set() 是否是成功的。似乎rzp.payments.transfer() 应该在set() 的承诺解决后调用..
  • 我同意。他们所有的异步工作都应该被提取到单服务函数中。我只是在尝试最简单的更改来解决退货问题。
  • @Mark_M 在没有重写他们所有代码的情况下,我添加了一些额外的东西,可能会为他们指明更好的方向。
【解决方案2】:

在第一个 then 方法调用中,函数的第一行中有一个 return 语句。之后的所有代码都不会执行,因此不会执行任何传输。

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, {

【讨论】:

  • 这指出了问题,但其他解决方案更全面。无论如何,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-16
  • 2021-09-01
相关资源
最近更新 更多