Error: Can't set headers after they are sent Braintree
Error: Can't set headers after they are sent Braintree
我目前正在为我正在创建的这个网站开发一个管理面板,所以我可以通过 Braintree 接受付款,但我需要实现检索客户交易的功能,但是一旦 header sent 它只发送其中一个而不是全部。是否可以将 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 文档进行的,我很清楚为什么会出现错误。非常感谢任何帮助,但我很难解释,所以如果您需要了解更多信息,请给我打电话!
更新:所以,我想我会探索另一种方法,我注意到 'response' 返回了一个 ID 数组。所以我将只使用 EJS 循环遍历所有这些,然后为每个交易创建一个单独的页面。
每个路由只能呈现一个响应。所以你只能调用一次,不能循环调用:
res.render('admin/test', {transaction: transaction}); });
您可以使用 each 方法遍历响应并构建结果:
var transactions =[];
response.each(function (err, transaction) { transactions.push(transaction) });
return res.render('admin/test', {transaction: transactions});
如果 each 方法是同步的,那将有效。如果不是(Nick 会知道),请使用以下解决方案。
免责声明:我为 Braintree 工作 :)
正如 Robert 所指出的,您只能在每个请求中调用一次 res.render
(或 end
请求的任何响应方法)一次(因此来自 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});
}
})
})
})
我目前正在为我正在创建的这个网站开发一个管理面板,所以我可以通过 Braintree 接受付款,但我需要实现检索客户交易的功能,但是一旦 header sent 它只发送其中一个而不是全部。是否可以将 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 文档进行的,我很清楚为什么会出现错误。非常感谢任何帮助,但我很难解释,所以如果您需要了解更多信息,请给我打电话!
更新:所以,我想我会探索另一种方法,我注意到 'response' 返回了一个 ID 数组。所以我将只使用 EJS 循环遍历所有这些,然后为每个交易创建一个单独的页面。
每个路由只能呈现一个响应。所以你只能调用一次,不能循环调用:
res.render('admin/test', {transaction: transaction}); });
您可以使用 each 方法遍历响应并构建结果:
var transactions =[];
response.each(function (err, transaction) { transactions.push(transaction) });
return res.render('admin/test', {transaction: transactions});
如果 each 方法是同步的,那将有效。如果不是(Nick 会知道),请使用以下解决方案。
免责声明:我为 Braintree 工作 :)
正如 Robert 所指出的,您只能在每个请求中调用一次 res.render
(或 end
请求的任何响应方法)一次(因此来自 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});
}
})
})
})