node.js - 如何在无论如何都被调用的链末尾添加快速中间件(OK/FAIL 响应)?
问题描述
有没有办法将中间件添加到被调用以跟踪/ 响应是否已发送的快递app
或链的末尾?router
res
我的意思是,无论是否:
- 发送响应(字符串、JSON 等)
- 静态服务文件。
- 在静态文件夹中找不到文件。
- 达到了一个全面的回调。
- 到达错误中间件。
例子
例如,如果我想记录所有内容......
响应是否成功,即:它通过express.static( ... )
中间件提供文件、从数据库中获取的一些数据或自定义中间件,或者再次...如果它失败/抛出错误...,有没有办法在最后调用回调?
到目前为止,据我所知,按照设计,如果静态文件成功提供服务(通过express.static),它不会调用next()
,因此链停在那里。
对于任何使用 的定制中间件res.send()
,您通常不想在next()
之后调用,因为它可能会导致一些不良副作用(重新发送标头的错误)。
对于错误处理程序来说,这更容易,因为所有不成功的响应都可以在这里捕获。
但是它如何输出成功/不成功的响应呢?这可能是没有中间件就应该完成的事情吗?
解决方案
我使用的解决方案最终与 @idbehold的解决方案略有不同,但简而言之,在快速应用程序中间件链的最顶端,我必须将回调挂钩到Response 对象的事件,该事件在大多数情况下都会被触发(全部?)我需要跟踪成功服务的请求的 HTTP 状态代码。res
finish
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.
})
推荐阅读
- python - 如何按需在窗口中显示单词
- python - 删除过多的循环
- amazon-web-services - API 网关在响应时间超过 3000 毫秒时抛出错误
- python-3.x - Django表单未提交数据
- node.js - 错误:用户未在 nodejs 中通过 amazon cognito 身份验证
- android - Dagger Hilt:如果没有 @Provides-annotated 方法就无法提供
- flutter - Sqflite 仅在 web.xml 中引发错误(MissingPluginException)。扑网
- java - 从 Tycho 构建中引用工作区项目
- android - onDataChange() 中的数据获取有点晚
- python - 如何解决 Pandas pd.Cut 出现错误/错误?