将Express的错误处理在将流到响应的管道流程时



我在处理Express JS应用中的错误时遇到一些问题。

我的问题是我正在向响应流动,我不知道什么是最好的方法处理可能在可读流中发生的错误。

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

...
app.use(app.router);
app.use(express.errorHandler());
...

这是我的路线:

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);
};

如果我将 TEST ERROR扔到功能的正文中,则按照Express errorHandler的预期处理。

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

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

我做错了什么?

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

一旦folderStream开始将数据输送到响应中,errorHandler将在下一步调用时(ERR)。

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

相关内容

  • 没有找到相关文章

最新更新