我刚开始使用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);
不幸的是,当发生错误时,我有一个Error: write after end
来自express,因为我已经在错误事件中发送了响应。
如果在将光标传输到响应之后光标流失败时,如何标记响应并显示错误状态?
答案 0 :(得分: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