我刚开始使用
mongodb stream functionality将数据直接传输到
express response.
为此,我使用了this question上的代码片段:
cursor.stream().pipe(JSONStream.stringify()).pipe(res);
我想在光标返回MongoError时将响应标记为500状态.不幸的是,使用此代码,错误以JSON返回,状态为200.
如何使用简单的解决方案处理?我是否必须在游标的错误事件中处理它?如果是这样,如果发生错误,我怎么能告诉不直接流表达响应?
编辑
我试过一个解决方案,在流上处理错误事件,如下所示:
var stream = cursor.stream();
stream.on('error', function(err){
res.status(500).send(err.message);
});
stream.pipe(JSONStream.stringify()).pipe(res);
不幸的是,当发生错误时,我遇到了错误:写完了
来自express,因为我已经在错误事件中发送了响应.
当我将光标流传输到响应后,当光标流失败时,如何以错误状态标记响应?
最佳答案 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