如何在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); });
这是做什么的?
- 它查询
app.routes
对象。 现在我们可以访问在我们的应用程序中定义的所有路线。 - 我们将当前url
req.url
与每个路由的正则expression式进行匹配。 - 由于这是一个应用程序级别的中间件,它会针对每个请求运行。 所以你得到像
Route Debugger: /router/smth/:id
这样的日志loggingRoute Debugger: /router/smth/:id
,如果你点击/router/smith/123
参考1 : http : //thejackalofjavascript.com/list-all-rest-endpoints/
参考2 : 如何在Express中获得所有注册的路线?