直接流式传输以表达响应时处理mongodb错误

时间:2016-10-26 10:30:40

标签: node.js mongodb express stream

我刚开始使用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,因为我已经在错误事件中发送了响应。

如果在将光标传输到响应之后光标流失败时,如何标记响应并显示错误状态?

1 个答案:

答案 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