我希望我的记录器中间件在发送响应时记录每个匹配的路由。但是可能有任意数量的嵌套子路由。我想我有这个:
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);
});
有可能吗?
答案 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);
});
这是做什么的?
app.routes
对象。现在我们可以访问我们的应用程序中定义的所有路由。req.url
与每条路线的正则表达式进行匹配。 Route Debugger: /router/smth/:id
/router/smith/123
之类的日志记录
醇>
参考1 :http://thejackalofjavascript.com/list-all-rest-endpoints/
参考2 :How to get all registered routes in Express?