在nodejs中的所有路由之后的中间件

时间:2017-06-20 08:21:54

标签: node.js express middleware

我想要像每条路线的快速日志请求摘要一样有中间件 =>

  

[POST] / books / commentpart 200 1435.472 ms - 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;

3 个答案:

答案 0 :(得分:0)

中间件只是一个执行某项操作的函数,然后使用" next()"将请求传递给下一个函数。所以,如果你真的想这样做,你需要在同一条路线上捕捉所有路线,就像这样

@inject('storeOne', 'storeTwo')

答案 1 :(得分:0)

最后它奏效了。实际上,在某些路由中,我忘了在每个路由器的末尾传递next()。

现在我使用responseTime函数做另一种方法,它可以完美地工作,而不需要为所有路由添加next()。谢谢大家!

    count = 0;

    $('#test').on("change", function(){ 
        count = 0;
    });

    $('#test').on("keyup", function(){  

        if(count == 0)
        {
            $('#tool').tooltip("show");
            count = 1;
        }
    });

    $('#tool').tooltip({
        placement: "bottom",
        trigger: "focus",
        title: "Click here",
    });

  <input type="text" id="test">
  <input type="button" id="tool">

答案 2 :(得分:0)

因此,中间件在注册时(使用app.useapp.all等)是适用于传入请求的规则队列。请注意,此注册在服务器启动时进行,并且是服务器本身的一部分,不是请求。

一旦全部设置好并且服务器正在运行,则只有在前一个跃点已明确调用next()的情况下,才调用第一个跃点之后的任何跃点(进入队列,也称为中间件)。换句话说,如果将app.use((req, res, next) => {});放在所有中间件的开头,则服务器将完全不执行任何操作! -此中间件只是吞下所有传入请求,而不会调用next()

问题

现在的问题是,如何注册一个中间件:

  1. 适用于所有规则,并且
  2. 在所有其他中间件之后运行

满足第二个要求并不容易。因为如上所述,此规则队列中的最后一跳仅在所有先前的路由都已妥善地依次调用next()时运行。有时由于种种原因而不会发生这种情况,包括只是忘记打电话给next()!而且很难强迫人们这样做。

解决方案

我需要在粗体上方的评论中提及@robertklep所说的内容。它正在on-finished上使用reshttps://github.com/jshttp/on-finished

示例:

// have this before all the other middlewares
app.use((req, res) => {
    console.log("I'll be the first line executed, almost ever!");
    onFinished(res, (err) => {
        console.log("and I'll be the last one, knowing response"
                    + " code which is already sent is: " + res.statusCode);
    });
};

这是什么,实际上是在响应完成时进行监听(您也可以使用on-headers)。因此,这是在快递上完成工作的一个全新维度,与现有的中间件队列机制垂直。请小心并享受! ;)