以快递方式处理错误,同时将pipe道stream转换为响

我在处理Express js应用程序中的错误时遇到了一些问题。

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

我正在使用errorHandler中间件,在路由中间件后面configuration:

... 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处理。

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

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

我做错了什么?

你的代码是正确的:问题是当出现错误时,部分返回。

一旦folderStream开始将数据传送到响应中, errorHandler在下一个(err)调用时无法写入folderStream

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