簡體   English   中英

Node.js流(錯誤:發送頭后無法設置頭)

[英]Nodejs stream (Error: Can't set headers after they are sent)

我正在嘗試從Braintree服務器構建一個api。 參考此文檔https://developers.braintreepayments.com/javascript+node/reference/general/result-handling/search-results

要從其服務器訪問所有事務,我必須返回一個節點流。

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. 
      });

  }
});

我了解流會分塊返回數據,因此上面的res.json()很可能多次被調用,從而導致Error: Can't set headers after they are sent

所以我的問題是如何將數據一整塊發送給客戶端? nodejs流使我感到困惑,我將閱讀更多有關它的內容,但是了解如何在不重新發送標頭的情況下將數據發送到客戶端將是很棒的。

除非正在讀取的流處於對象模式,否則您不應對data事件做出任何假設。 因為TCP是流,所以您可能會發生一個data事件或一個data事件(取決於輸入的大小)(一百)。

您可能想要的是這樣的東西(假設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);
      });

  }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM