Как закрыть поток https в Node.js

Я загружаю .ndjson файл через https. Я хочу закрыть его после прочтения 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 файл. Можно ли закрыть поток в середине запроса?

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);
  });
Другие вопросы по тегам