【发布时间】:2014-02-25 20:51:36
【问题描述】:
我在处理 Express js 应用程序中的错误时遇到了一些问题。
我的问题是我正在通过管道传输响应,但我不知道什么是最好的方法 处理可读流中可能发生的错误。
我正在使用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 扔到函数体中,它会按预期由 express errorHandler 处理。
无论如何,如果在流中发出错误事件,则会调用错误事件处理程序,因为我可以在控制台中看到消息,但永远不会调用 errorHandler。
如果我不处理错误事件,整个节点进程就会崩溃。如果我处理它,服务器会向客户端发送 500 响应,但没有调用 errorHandler,所以我错过了日志中的堆栈跟踪。
我做错了什么?
【问题讨论】:
-
处理它的意思是,打电话给
next(err)?还有服务器发送 500,是纯文本消息仅包含错误消息(Error: ENOENT)还是 h1 中带有express和 h2 中的错误的 html 页面? -
通过处理我的意思是,至少,记录错误并关闭响应。我知道并非总是可以发送 500 状态甚至显示 html 错误页面,因为在我将标头发送到客户端或开始向其发送 JSON 之后可能会发生错误。
-
你怎么知道
errorHandler没有被调用? -
因为响应从未关闭,而且我在日志中没有发现错误的证据
-
我尝试了许多不同的情况,并且总是将错误记录到控制台。你用的是什么版本的快递?
标签: javascript node.js express stream