node.js - 错误: Can't set headers after they are sent Braintree

标签 node.js braintree

我目前正在为我正在创建的网站开发一个管理面板,因此我能够通过 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});
  })
})

或者,您可以使用 responseids 属性来比较从 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/

相关文章:

javascript - 使用 Braintree 付款从保险库中检索数据

paypal - 二级支付处理器作为下降的后备

javascript - 回调 spy 不会在流结束时被调用

javascript - 如何在不重新加载页面的情况下使用ajax发送数据? ( Node )

javascript - 和谐解构ReferenceError : Invalid left-hand side in assignment

ios - Braintree 获取现有的支付方式

javascript - Web 控制台上子进程的 GSUTIL 文件上传百分比

mysql - 从 node.js 在 redis 中查询

php - Braintree 事务中未定义后置变量

android - 在 Meteor mobile (android - cordova) 上使用 Braintree