2016-10-26 1 views
4

Я только начинаю использовать mongodb stream functionality для потоковой передачи данных непосредственно на express response.Обращение с ошибкой mongodb при потоковой передаче непосредственно для выражения ответа

Для этого я использую кусок кода, который находится на this question:

cursor.stream().pipe(JSONStream.stringify()).pipe(res); 

Я хочу отметить реакцию с 500 статусом, когда курсор возвращается MongoError. К сожалению, с этим кодом ошибка возвращается в JSON со статусом 200.

Как я могу справиться с этим с помощью простых решений? Должен ли я обрабатывать это в случае ошибки курсора? Если да, то как я могу сказать, чтобы не передавать напрямую, чтобы выразить ответ, если произошла ошибка?

EDIT

Я попытался решение с обработкой события ошибки в потоке, как это:

var stream = cursor.stream(); 
stream.on('error', function(err){ 
    res.status(500).send(err.message); 
}); 
stream.pipe(JSONStream.stringify()).pipe(res); 

К сожалению, когда произошла ошибка, я получил Error: write after end от потому что я уже отправил ответ в случае ошибки.

Как я могу выразить ответ с сообщением об ошибке при исчезновении потока курсора ПОСЛЕ того, как я передал его в ответ?

ответ

2

WriteStream завершается, когда ReadStream заканчивается или имеет ошибку.

Поэтому вам необходимо как-то предотвратить это поведение по умолчанию, когда ошибки возникают во время работы трубы. Вы можете сделать это, передав {end: false} в качестве опции трубы.

Этот параметр изменяет поведение по умолчанию, так что даже если возникла ошибка, поток записи все еще открыт, и вы можете продолжать отправлять больше данных (например, состояние ошибки).

var stream = cursor.stream(); 

stream.on('error', function() { 
    res.status(500).send(err.message); 
}); 

stream.on('end', function(){ 
    //Pipe does not end the stream automatically for you now 
    //You have to end it manually 
    res.end(); 
}); 

stream.pipe(res, {end:false}); //Prevent default behaviour 

Более подробную информацию можно найти на:
https://nodejs.org/dist/latest-v6.x/docs/api/stream.html#stream_readable_pipe_destination_options

+0

Хм .. Связанная документация говорит: «Одно важное предостережение в том, что если читаемый поток выдает ошибку во время обработки, назначения Writable не закрыт автоматически. Если возникает ошибка, необходимо будет вручную закрыть каждый поток, чтобы предотвратить утечку памяти. ". Таким образом, кажется, что поток записи не заканчивается ошибкой чтения потока. – ronkot

 Смежные вопросы

  • Нет связанных вопросов^_^