如何在快递JS中获得匹配的路由模式?

时间:2014-12-09 18:43:03

标签: node.js express

我希望我的记录器中间件在发送响应时记录每个匹配的路由。但是可能有任意数量的嵌套子路由。我想我有这个:

var app = express();
var router = express.Router();

app.use(function myLogger(req, res, next)
{
    res.send = function()
    {
        //Here I want to get matched route like this: '/router/smth/:id'
        //How can I do this?
    });
}

app.use('/router', router);

router.get('/smth/:id', function(req, res, next)
{
  res.send(response);
});

有可能吗?

2 个答案:

答案 0 :(得分:10)

由于应用级中间件不了解路由,因此这是不可能的。但是,如果您使用记录器中间件作为路由中间件,例如:

router.get('/smith/:id', logger, function (req, res) { ... });

您可以在请求对象上使用两个参数的组合:

req.route.path => '/smth/:id'
req.originalurl => '/router/smth/123'

我会告诉你如何将两者合并为一个字符串。

答案 1 :(得分:1)

以下是代码(快递2.x)

// npm -v express       
// 2.14.2
var app = express();
var router = express.Router();

app.use(function(req, res, next) {
  var routes = app.routes; // See Reference 1.

  for(var method in routes) {
    if(routes.hasOwnProperty(method)) {
      for(var route in routes[method]) {
        if(req.url.toString().match(routes[method][route].regexp)) {
          console.log('Route Debugger: ' + routes[method][route].path);
        }
      }
    }
  }
  next();
});

app.use('/router', router);

router.get('/smth/:id', function(req, res, next)
{
  res.send(response);
});

这是做什么的?

  1. 查询app.routes对象。现在我们可以访问我们的应用程序中定义的所有路由。
  2. 我们将当前网址req.url与每条路线的正则表达式进行匹配。
  3. 由于这是一个应用程序级中间件,因此它会针对每个请求运行。因此,如果您点击Route Debugger: /router/smth/:id
  4. 这样的网址,就会获得/router/smith/123之类的日志记录

    参考1 http://thejackalofjavascript.com/list-all-rest-endpoints/
    参考2 How to get all registered routes in Express?