#node.js #express #streaming
#node.js #выражать #потоковая передача
Вопрос:
Мне нужно отправить данные из большого csv-файла по Http.Вот мой код
const transformToJson = new Transform({
objectMode: true,
transform(chunk, encoding, done) {
this.push(JSON.stringify(chunk));
done();
}
});
app.get('/api', (req: Request, res: Response) => {
const stream = fs.createReadStream(filePath);
stream.pipe(csvParser()).pipe(transformToJson).pipe(res);
stream.on('open', () => console.log('open'))
stream.on('close', () => console.log('closed'))
req.on('aborted', () => stream.destroy());
})
Проблема в том, что когда я отправляю запрос на эту конечную точку, я получаю данные, но только один раз. Если я снова отправлю свой запрос (без перезагрузки сервера), он почти мгновенно вернет void.
open
[start:run] closed
[start:run] open
[start:run] open
[start:run] open
[start:run] open
Это консольные журналы открытия и закрытия событий, как вы можете видеть, читаемый поток закрывается только один раз, и ошибок также нет.
Будем благодарны за вашу помощь!
Комментарии:
1. Вы пытались добавить средство прослушивания для ошибки?
stream.on('error', (err) => console.log('error', err))
2. Да, ошибок не возникает
3. Работает ли это, когда CSV короткий?
4. В общем, тот же пустой ответ с улучшением на 1, читаемый поток теперь открывается, а затем закрывается каждый раз
Ответ №1:
Проблема была в моем потоке преобразования. Я создал его один раз, но должен был делать это с каждым запросом.
const transformToJson = () => new Transform({
objectMode: true,
transform(chunk, encoding, done) {
this.push(JSON.stringify(chunk));
done();
}
});