gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:41 25 4
gpt4 key购买 nike

有没有办法将中间件添加到快速 approuter 链的末尾,该链被调用以跟踪 res >/响应是否已发送?

我的意思是,无论是否:

  • 发送响应(字符串、JSON 等)
  • 静态服务文件。
  • 在静态文件夹中找不到文件。
  • 已达到catch-all回调。
  • 到达错误中间件。

示例

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

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

据我所知,按照设计,如果静态文件成功提供(通过 express.static),它不会调用 next() ,所以链就停在那里。

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

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

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

最佳答案

我采用的解决方案最终与this one略有不同。作者:@idbehold,但简而言之,在 Express 应用中间件链的最顶端,我必须将回调 Hook 到 res响应对象的 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();
});

我现在可以获得如下内容:

enter image description here

编辑

好吧!因此,假设您的中间件链的“末端”还有一个错误处理程序,该处理程序可以提供错误 404 的服务。代码,这将触发 finish事件于 res对象。

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

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

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

关于node.js - 如何在无论如何都会被调用的链的末尾添加快速中间件(OK/FAIL 响应)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55818548/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com