Сервер отвечает потоковыми данными только один раз

#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();
    }
});