【问题标题】:Error handling in express while piping stream to response快速处理错误,同时将流传输到响应
【发布时间】: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


【解决方案1】:

您的代码是正确的:问题是当错误发生时,resonse 被部分返回。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多