big*_*igp 4 middleware node.js express
app有没有办法将中间件添加到 Express或Chain的末尾router,以跟踪res/ 响应是否已发送?
我的意思是,无论是否:
例如,如果我想记录所有内容......
响应是否成功,即:它通过中间件提供文件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)
| 归档时间: |
|
| 查看次数: |
4182 次 |
| 最近记录: |