Morgan中间件如何正确获取响应的statusCode?
为什么自定义中间件拿不到正确的响应状态码,而Morgan可以?
你的问题核心在于中间件的执行时机和响应状态码的修改时机不匹配:
- 你写的中间件是在调用
next()之前就打印了res.statusCode,这时候后续的路由处理函数(比如处理DELETE请求的逻辑)还没执行,res.statusCode还是Express默认的200,自然拿不到最终的404。 - Morgan之所以能拿到正确的状态码,是因为它没有在
next()前直接输出日志,而是监听了响应对象的finish或close事件——这两个事件会在响应完全发送给客户端之后触发,此时路由处理函数已经完成了状态码的设置(比如返回404),所以能获取到最终的res.statusCode。
给你改一下自定义中间件,实现类似Morgan的效果:
const util = require('./your-util-module'); // 替换成你的util模块路径 app.use((req, res, next) => { const { url, method } = req; // 监听响应结束事件,此时才能拿到最终的statusCode res.on('finish', () => { console.log(method, url, res.statusCode, util.getTime()); }); next(); });
这样修改后,当你的DELETE请求返回404时,中间件就能打印出正确的状态码了。
内容的提问来源于stack exchange,提问作者Dani
相关产品推荐
相关产品推荐

