Как закрыть поток 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 ответ
Есть несколько решений:
- Отправьте заголовок, чтобы закрыть соединение:
this.set("Connection", "close")
- Окончание потока благодаря
this.end()
Я не знаю, какой из них лучший.
Итак, в вашем примере у вас есть проблема из-за this
(Я рекомендую вам взглянуть на эту ссылку). Попробуйте следующий код:
res
.pipe(ndjson.parse())
.on('data', obj => {
rows.push(obj);
if (rows.length === amount) {
this.end();
}
})
.on('end', () => {
resolve(rows);
});