错误:在发送Braintree后无法设置标头

时间:2016-12-31 14:24:37

标签: node.js braintree

我目前正在为我正在创建的这个网站创建一个管理面板,所以我能够通过Braintree接受付款,但我需要实现检索客户交易的能力,但是一旦发送了标题,它就会发送一个他们而不是整件事。是否可以将json组合成一个数组,以便它将在一个标题中发送?

代码:

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文档,我确切地知道错误发生的原因。任何帮助都非常感谢,我很难解释所以如果你需要了解更多信息,请给我一个大声喊叫!

更新:所以,我想我会探索另一种方法,并且我注意到了#39;响应'给出一系列ID。因此,我将使用EJS循环遍历所有这些,然后为每个事务创建一个单独的页面。

2 个答案:

答案 0 :(得分:1)

每条路线只能渲染一个响应。所以你只能调用一次而不是循环:

res.render('admin/test', {transaction: transaction}); });

您可以使用每种方法迭代响应并构建结果:

var transactions =[];
response.each(function (err, transaction)   { transactions.push(transaction) });
return res.render('admin/test', {transaction: transactions});

如果每个方法都是同步的,那将会有效。如果不是(尼克会知道),请使用下面的解决方案。

答案 1 :(得分:1)

免责声明:我为Braintree工作:)

正如罗伯特所说,每次请求只能调用res.render(或end请求的任何响应方法)(因此来自快递的错误)。

很遗憾,您无法将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});
  })
})

或者,您可以使用ids的{​​{1}}属性来比较您从response构建的事务数组,以了解何时结束请求:

each