Nodejs 中所有路由之后的中间件

slo*_*gan 5 middleware node.js express

我想要一个中间件,例如每个路由的 Express 日志请求摘要末尾=>

[POST] /books/commentpart 200 1435.472 毫秒 - 35

我想在每个请求结束时记录更多数据。但我不知道如何编写这样的中间件。我在所有路线之后尝试了中间件功能,但它不起作用。在每个路由器中,我还传递 next() 调用。


app.use(responseTime());
//router
app

  .use(users(app, db))  
  .use(dataLogs(app, db))  
  .use(category(app, db));

//log middleware
app.use(function(req, res, next) {   
    var data = {};  
    var method = req.method;
    if(method == 'GET'){
      data = req.query;
    } else {
      data = req.body;
    }   
    var resTime = res.getHeader('X-Response-Time');    
    log.debug(' [ ' + iduser + ' ] - ' + req.route.path +  ' - ' + resTime + ' : ' + JSON.stringify(data));
});

module.exports = app;
Run Code Online (Sandbox Code Playgroud)

Ari*_*son 0

中间件只是一个执行某些操作然后使用“next()”将请求传递给下一个函数的函数。因此,如果您真的想这样做,您需要在同一条路线中捕获所有路线,如下所示

app.all('*', (req, res) => {
      // do something before

      // your async code here 

      // do something after
});
Run Code Online (Sandbox Code Playgroud)

  • 中间件只被称为“进去”(当收到请求时),而不是“出去”(当发回响应时),因此如果记录器依赖于响应的数据(如特定的响应头),你需要使用类似 [`on-headers`](https://github.com/jshttp/on-headers) 或 [`on-finished`](https://github.com/jshttp/on-finished )。 (2认同)