节点 JS 函数未被执行。可能是什么原因?
Node JS function not being executed. What could be the reason?
我想使用 Firebase Cloud Functions 获取付款并立即创建转账。捕获正确发生,但传输未执行。可能是什么原因?
参考文档: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
})
});
您在第一个 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, {
如果你想要return初始调用中的数据,而且还进行传输,只需将其更改为以下内容:
// 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
,它后面的代码将永远不会是 运行。通过将你想要的 return 存储在一个变量中,你可以做其他的工作,然后 return 它。
或者,您可以 运行 以不同的顺序排列代码,因为看起来这两个调用并不相互依赖。
实际上,您应该将所有异步工作分解为单一服务和可理解的函数,这些函数可以链接在一起以提高可读性。例如,您的链可能如下所示:
capturePayment(payment_id, 100000)
.then(updateDB)
.then(transfer)
.then(data => console.log('success'))
.catch(err => console.error(err))
那么您所要做的就是确保每个链接函数都接受一个参数,该参数可以从前一个函数的结果传递过来。
我想使用 Firebase Cloud Functions 获取付款并立即创建转账。捕获正确发生,但传输未执行。可能是什么原因?
参考文档: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
})
});
您在第一个 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, {
如果你想要return初始调用中的数据,而且还进行传输,只需将其更改为以下内容:
// 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
,它后面的代码将永远不会是 运行。通过将你想要的 return 存储在一个变量中,你可以做其他的工作,然后 return 它。
或者,您可以 运行 以不同的顺序排列代码,因为看起来这两个调用并不相互依赖。
实际上,您应该将所有异步工作分解为单一服务和可理解的函数,这些函数可以链接在一起以提高可读性。例如,您的链可能如下所示:
capturePayment(payment_id, 100000)
.then(updateDB)
.then(transfer)
.then(data => console.log('success'))
.catch(err => console.error(err))
那么您所要做的就是确保每个链接函数都接受一个参数,该参数可以从前一个函数的结果传递过来。