快速处理快速,同时管道流到响应

And*_*odi 7 javascript stream node.js express

我在Express js app中处理错误时遇到了一些问题.

我的问题是我正在将流传递给响应,我不知道处理可读流中可能发生的错误的最佳方法是什么.

我正在使用errorHandler中间件,在路由中间件之后配置:

...
app.use(app.router);
app.use(express.errorHandler());
...
Run Code Online (Sandbox Code Playgroud)

这是我的路线:

exports.folders = function(req, res, next) {
    //throw new Error("TEST ERROR");
    var path = decodeURIComponent(req.params.path),
        foldersStream = wd.listFolders(path);

    foldersStream.on("error",function(err){
        console.log("STREAM ERROR")
        console.dir(next.name)
        return next(err);
    });


    res.setHeader("content-type", "application/json");
    foldersStream.pipe(res);
};
Run Code Online (Sandbox Code Playgroud)

如果我抛出TEST ERROR函数的主体,它将按照预期的方式处理errorHandler.

无论如何,如果在流中发出错误事件,则会调用错误事件处理程序,因为我可以在控制台中看到该消息,但errorHandler永远不会被调用.

如果我不处理错误事件,整个节点进程崩溃.如果我处理它,服务器会向客户端发送500响应,但errorHandler不会被调用,所以我错过了日志中的堆栈跟踪.

我做错了什么?

Feu*_*ugy 1

您的代码是正确的:问题是发生错误时部分返回了响应。

一旦开始folderStream将数据通过管道传输到响应中,则errorHandler在被 next(err) 调用时将无法写入堆栈跟踪。

在这种情况下,浏览器(或 http 客户端)收到取消的响应。