如何在无论如何都会被调用的链的末尾添加快速中间件(OK/FAIL 响应)?

big*_*igp 4 middleware node.js express

app有没有办法将中间件添加到 Express或Chain的末尾router,以跟踪res/ 响应是否已发送?

我的意思是,无论是否:

  • 发送响应(字符串、JSON 等)
  • 静态服务文件。
  • 静态文件夹中未找到文件。
  • 已达到包罗万象的回调。
  • 到达错误中间件。

例子

例如,如果我想记录所有内容......

响应是否成功即:它通过中间件提供文件express.static( ... )、从数据库获取的一些数据或自定义中间件,或者再次...如果失败/抛出错误...,有没有办法在最后调用回调?

到目前为止,据我所知,按照设计,如果静态文件成功提供服务(通过express.static),它不会调用next(),因此链停在那里。

对于任何使用 的定制中间件res.send(),您通常不想next()事后调用,因为它可能会导致一些不良的副作用(标头重新发送的错误)。

对于错误处理程序来说,这更容易,因为所有不成功的响应都可以在这里捕获。

但它如何输出成功/不成功的响应呢?这是否应该在没有中间件的情况下完成?

big*_*igp 11

我采用的解决方案最终@idbehold 的解决方案略有不同,但简而言之,在 Express 应用程序中间件链的最顶层,我必须将回调挂接到resResponse 对象的finish事件,该事件在大多数情况下都会被触发(全部?)我需要跟踪成功服务的请求的 HTTP 状态代码。

app.use( ( req, res, next ) => {
    res.on( 'finish', () => {
        var codeStr = String( res.statusCode );
        codeStr = codeStr[res.statusCode < 400 ? 'green' : 'red'];
        var output = [req.method.green, req.fullUrl().green, codeStr];
        trace( output.join( ' ' ) );
    } );

    next();
});
Run Code Online (Sandbox Code Playgroud)

我现在可以得到类似的东西:

在此输入图像描述

编辑

好吧!因此,如果您在中间件链的“末端”还有一个错误处理程序,该处理程序提供带有错误404代码的内容,那么它将触发对象finish上的事件res

此类错误处理程序的示例:

app.use( ( err, req, res, next ) => {
    trace( "Error!".red );
    trace( err );

    res.status( 404 ).send(); // Triggers 'finish' on res.
})
Run Code Online (Sandbox Code Playgroud)