有没有办法监控Express.js中的每个响应?

时间:2016-03-01 06:25:35

标签: node.js express

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

initialize

3 个答案:

答案 0 :(得分:4)

您应该知道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 :(得分:2)

为此你可以编写两个中间件

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();
}

可以使用现有工具。

答案 2 :(得分:0)

好的,首先,您只看到请求的原因是因为中间件的工作原理。一切按特定顺序运行一次,并且只运行一次。当您的中间件运行时,很可能在创建响应之前。为了获得响应,您必须在控制器进行渲染或类似操作时使代码运行。

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