【问题标题】:How to close a https stream in Node.js如何在 Node.js 中关闭 https 流
【发布时间】:2018-02-06 21:56:20
【问题描述】:

我正在通过 https 加载 .ndjson 文件。我想在读取 100 行文件后关闭它。

  const amount = 100;
  https.get(url, (res) => {
    var { statusCode } = res;

    if (statusCode !== 200) {
      throw new Error(`Request Failed.\n Status Code: ${statusCode}`);
    }

    res.setEncoding('utf8');
    let rows = [];
    res
      .pipe(ndjson.parse())
      .on('data', function (obj) {
        rows.push(obj);
        if (rows.length === amount) {
          this.end();
        }
      })
      .on('end', () => {
        resolve(rows);
      });
  }).on('error', (e) => {
    throw new Error(e.message);
  });

但是我尝试关闭流的每一种方式,都会出现相同的错误消息:

Error: Could not parse row {"username"...
    at DestroyableTransform.parseRow [as mapper] (C:\Users\thoma\Documents\GitHub\test\node_modules\ndjson\index.js:19:28)
    at DestroyableTransform.flush [as _flush] (C:\Users\thoma\Documents\GitHub\test\node_modules\split2\index.js:44:21)
    at DestroyableTransform.<anonymous> (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_transform.js:138:49)
    at Object.onceWrapper (events.js:314:30)
    at emitNone (events.js:105:13)
    at DestroyableTransform.emit (events.js:207:7)
    at prefinish (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_writable.js:596:14)
    at finishMaybe (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_writable.js:604:5)
    at afterWrite (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_writable.js:470:3)
    at _combinedTickCallback (internal/process/next_tick.js:144:20) 

并且流在未强制关闭时工作正常,因此与ndjson 文件无关。是否可以在请求中间关闭流?

【问题讨论】:

    标签: javascript node.js https stream ndjson


    【解决方案1】:

    有几种解决方案:

    1. 发送标头关闭连接:this.set("Connection", "close")
    2. 感谢this.end() 结束直播

    我不知道哪个最好。

    因此,在您的示例中,由于this,您遇到了问题(我建议您查看此链接)。试试下面的代码:

    res
      .pipe(ndjson.parse())
      .on('data', obj => {
        rows.push(obj);
        if (rows.length === amount) {
          this.end();
        }
      })
      .on('end', () => {
        resolve(rows);
      });
    

    【讨论】:

      猜你喜欢
      • 2016-11-24
      • 2013-01-11
      • 2020-06-28
      • 2015-11-20
      • 2017-04-30
      • 2020-06-21
      • 2014-05-24
      • 2017-02-14
      • 2016-11-08
      相关资源
      最近更新 更多