有什么办法可以监视Express.js中的每个响应吗?

我想在express.js中创build一个中间件函数。 它可以监视每个请求和响应。 我创build了一个中间件,但它只能监视请求,而不是响应。

function middlewareFunc (req,res,next) { console.log(req.body , req.params , req.query); next(); } 

你应该知道function(req, res, next) res function(req, res, next)是类http.ServerResponse一个实例。 因此可以在finish事件中进行监听,请参阅以下链接: https : //nodejs.org/api/stream.html#stream_event_finish

 app.use(function (req, res, next) { function afterResponse() { res.removeListener('finish', afterRequest); res.removeListener('close', afterRequest); // action after response } res.on('finish', afterResponse); res.on('close', afterResponse); // action before request // eventually calling `next()` }); app.use(app.router); 

app.use()和中间件可以用于“之前”, closefinish事件的组合可以用于“之后”。

为此你可以写两个中间件

1)在所有请求端点之前。

 //middleware function middlewareFunEarlier(req,res,next) { console.log(req.body , req.params , req.query); next(); } app.use(middlewareFunEarlier); app.get('/', function(req, res, next){ //do something res.end(); }); 

2)终点之后。 你必须在所有的端点使用next()

 app.get('/', function(req, res, next){ //do something next(); }); app.use(middlewareFunLater); //middlware function middlewareFunLater(req, res, next){ console.log(res); res.end(); } 

它可以解决现有的工具。

好的,首先,你只看到请求的原因是因为中间件的工作原理。 一切按一定顺序运行一次,只运行一次。 当你的中间件运行时,很可能在响应被创build之前。 为了得到响应,你将不得不让你的代码在你的控制器去渲染或类似的东西时运行。

其次,看起来就像是基本的日志logging就是所有你需要的(天气是一个图书馆或者只是控制台日志logging的东西)。