我目前正在为我正在创建的网站开发一个管理面板,因此我能够通过 Braintree 接受付款,但我需要实现检索客户交易的功能,但一旦发送 header ,它只发送其中之一他们,而不是全部。是否可以将 json 组合到一个数组中,以便它会在一个 header 中发送?
代码:
router.get('/:cid/test', function(req, res) {
var stream = gateway.transaction.search(function (search) {
search.customerId().is(req.params.cid);
}, function (err, response) {
response.each(function (err, transaction) {
return res.render('admin/test', {transaction: transaction});
});
});
});
这只是遵循 Braintree 文档,我确切地知道发生错误的原因。非常感谢任何帮助,但我不擅长解释,所以如果您需要了解更多信息,请给我打电话!
更新:所以,我想我应该探索另一种方法,我注意到“响应”返回了一个 id 数组。因此,我将使用 EJS 循环遍历所有这些,然后为每个事务创建一个单独的页面。
最佳答案
免责声明:我在 Braintree 工作:)
正如 Robert 指出的,每个请求只能调用一次 res.render
(或任何结束
请求的响应方法)(因此来自express的错误) 。
不幸的是,您不能将 response
视为数组,因此您需要使用
与 search responses
交互的两种有记录的方式之一。我个人更喜欢流方法,因为它更清晰:
app.get('/stream', function (req, res) {
var transactions = []
var transactionStream = gateway.transaction.search(function (search) {
search.customerId().is(req.params.cid);
})
transactionStream.on('data', function (transaction) {
transactions.push(transaction)
})
transactionStream.on('error', function () { /* handle errors */ })
transactionStream.on('end', function () {
res.json({transactions: transactions});
})
})
或者,您可以使用 response
的 ids
属性来比较从 each
构建的事务数组,以了解何时结束请求:
app.get('/calback', function (req, res) {
var transactionStream = gateway.transaction.search(function (search) {
search.customerId().is(req.params.cid);
}, function (err, response) {
var transactions = []
response.each(function (err, transaction) {
transactions.push(transaction)
if (transactions.length === response.ids.length) {
res.json({transactions: transactions});
}
})
})
})
关于node.js - 错误: Can't set headers after they are sent Braintree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41409089/