我在Express js app中处理错误时遇到了一些问题。
我的问题是我正在使用流媒体来响应,我不知道什么是最好的方法 处理可读流中可能发生的错误。
我正在使用errorHandler中间件,在路由中间件之后配置:
...
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
抛出函数体内,则会按照errorHandler
的预期处理它。
无论如何,如果在流中发出错误事件,则会调用错误事件处理程序,因为我可以在控制台中看到该消息,但errorHandler
永远不会被调用。
如果我不处理错误事件,整个节点进程崩溃。如果我处理它,服务器会向客户端发送500响应,但不会调用errorHandler
,所以我会错过日志中的堆栈跟踪。
我做错了什么?
答案 0 :(得分:1)
您的代码是正确的:问题是当发生错误时会部分返回共鸣。
一旦folderStream
开始将数据传输到响应中,errorHandler
在下一个(错误)调用时无法编写堆栈跟踪。
在这种情况下,浏览器(或http客户端)收到了取消的响应。