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

我刚开始使用
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

点赞