javascript - Nodejs 流(错误 : Can't set headers after they are sent)

标签 javascript node.js stream

我正在尝试从 braintree 服务器构建一个 api。引用此文档 https://developers.braintreepayments.com/javascript+node/reference/general/result-handling/search-results

要从他们的服务器访问所有交易,我必须返回一个 Node 流。

app.get('/project', function(req, res) {
  if(req.user) {

      var stream = gateway.transaction.search(function (search) {
        search.customerId().is(req.user.id);
      });

      stream.on("ready", function () {
        console.log(stream.searchResponse);
      });

      stream.on("data", function (data) {
        res.json(data) // can't set headers after they are sent. 
      });

  }
});

我知道流以 block 的形式返回数据,所以上面的 res.json() 很可能被多次调用导致 Error: Can't set headers after they are已发送

所以我的问题是如何将这些数据一次性发送给客户端? nodejs 流让我感到困惑,我将阅读更多相关内容,但了解如何在不重新发送 header 的情况下将数据发送到客户端会很棒。

最佳答案

除非您正在读取的流处于对象模式,否则您不应该对 data 事件做出任何假设。您可以获得一个或一百个 data 事件(当然取决于输入大小),因为 TCP 是一个流。

你可能想要的是这样的东西(假设 stream 不是对象模式):

app.get('/project', function(req, res) {
  if(req.user) {

      var stream = gateway.transaction.search(function (search) {
        search.customerId().is(req.user.id);
      });

      stream.on("ready", function () {
        console.log(stream.searchResponse);
      });

      var buf = '';
      stream.on("data", function (data) {
        buf += data;
      });

      stream.on("end", function() {
        res.setHeader('Content-Type', 'application/json');
        res.send(buf);
      });

  }
});

或者只是将流通过管道传递给响应:

app.get('/project', function(req, res) {
  if(req.user) {

      var stream = gateway.transaction.search(function (search) {
        search.customerId().is(req.user.id);
      });

      stream.on("ready", function () {
        console.log(stream.searchResponse);
      });

      res.setHeader('Content-Type', 'application/json');

      stream.pipe(res);
  }
});

对于一个对象流,你可能会这样做:

app.get('/project', function(req, res) {
  if(req.user) {

      var stream = gateway.transaction.search(function (search) {
        search.customerId().is(req.user.id);
      });

      stream.on("ready", function () {
        console.log(stream.searchResponse);
      });

      var result = [];
      stream.on("data", function (data) {
        result.push(data);
      });

      stream.on("end", function() {
        res.json(result);
      });

  }
});

关于javascript - Nodejs 流(错误 : Can't set headers after they are sent),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26556830/

相关文章:

javascript - 将 JS 函数添加到并行队列

node.js - 将内存中的文件下载并上传到 Google Drive

linux - 附加到正在运行的进程的输出

javascript - Angularjs 字段仅在其值大于零时有效

javascript - getJSON函数中覆盖的变量值

node.js - 启动 vue js dev 服务器给出错误 : . plugins[0] may only be a two-tuple or three-tuple

node.js - jsreport 查找扩展失败

java - 客户端正在从 TCP 套接字中丢失一些线路

javascript - 加载的 div Accordion 在窗口而不是容器 div 中打开

javascript - 任何用于动画饼图的 JS 框架?