首页 > 解决方案 > 如何在无论如何都被调用的链末尾添加快速中间件(OK/FAIL 响应)?

问题描述

有没有办法将中间件添加到被调用以跟踪/ 响应是否已发送的快递app或链的末尾?routerres

我的意思是,无论是否:

例子

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

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

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

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

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

但是它如何输出成功/不成功的响应呢?这可能是没有中间件就应该完成的事情吗?

标签: node.jsexpressmiddleware

解决方案


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

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();
});

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

在此处输入图像描述

编辑

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

这种错误处理程序的示例:

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

    res.status( 404 ).send(); // Triggers 'finish' on res.
})

推荐阅读