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

我希望我的logging器中间件发送响应时logging每个匹配的路由。 但是可能有任何数量的嵌套子路由。 假设我有这个:

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

可能吗?

因为应用程序级中间件不了解路由,所以这是不可能的。 但是,如果将logging器中间件用作路由中间件,如:

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

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

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

我会把它留给你,你想如何结合成一个string。

这里的代码(在快速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. 我们将当前urlreq.url与每个路由的正则expression式进行匹配。
  3. 由于这是一个应用程序级别的中间件,它会针对每个请求运行。 所以你得到像Route Debugger: /router/smth/:id这样的日志loggingRoute Debugger: /router/smth/:id ,如果你点击/router/smith/123

参考1 : http : //thejackalofjavascript.com/list-all-rest-endpoints/
参考2 : 如何在Express中获得所有注册的路线?