节点JS功能未被执行。可能是什么原因?

时间:2018-05-22 06:22:58

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

我想使用Firebase云功能捕获付款并立即在付款时创建转帐。捕获正确发生但传输未执行。可能是什么原因?

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

以下是我的Firebase云功能的源代码:

   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 :(得分:3)

如果您想在初始通话中返回数据,但也要进行转移,只需将其更改为以下内容:

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

然后你需要确保的是你的每个链接函数只接受一个参数,可以从前一个结果中传递出来。

答案 1 :(得分:1)

在第一个方法调用中,函数的第一行中有一个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, {