有谁知道是否有可能获得用于触发路线的路径?
例如,假设我有这个:
app.get('/user/:id', function(req, res) {});
使用以下简单的中间件
function(req, res, next) {
req.?
});
我希望能够在中间件中获得/user/:id
,这不是req.url
。
答案 0 :(得分:23)
你想要的是req.route.path
。
例如:
app.get('/user/:id?', function(req, res){
console.log(req.route);
});
// outputs something like
{ path: '/user/:id?',
method: 'get',
callbacks: [ [Function] ],
keys: [ { name: 'id', optional: true } ],
regexp: /^\/user(?:\/([^\/]+?))?\/?$/i,
params: [ id: '12' ] }
http://expressjs.com/api.html#req.route
修改强>
正如评论中所解释的那样,在中间件中获取req.route
很困难/骇客。路由器中间件是填充req.route
对象的中间件,它可能比您正在开发的中间件低。
这样,只有当你连接到路由器中间件以便在Express自己执行之前为你解析req.route
时,才能获得req
。
答案 1 :(得分:12)
FWIW,另外两个选择:
// this will only be called *after* the request has been handled
app.use(function(req, res, next) {
res.on('finish', function() {
console.log('R', req.route);
});
next();
});
// use the middleware on specific requests only
var middleware = function(req, res, next) {
console.log('R', req.route);
next();
};
app.get('/user/:id?', middleware, function(req, res) { ... });
答案 2 :(得分:1)
使用原型覆盖的这个讨厌的技巧将有助于
"use strict"
var Route = require("express").Route;
module.exports = function () {
let defaultImplementation = Route.prototype.dispatch;
Route.prototype.dispatch = function handle(req, res, next) {
someMethod(req, res); //req.route is available here
defaultImplementation.call(this, req, res, next);
};
};
答案 3 :(得分:0)
req.route.path
将用于获取给定路线的路径。但是,如果您想要完整的路径(包括父路径的路径),请使用
let full_path = req.baseUrl+req.route.path;
希望有帮助
答案 4 :(得分:0)
我知道这有点晚了,但是对于以后的Express / Node设置req.originalUrl
来说还可以!
希望这会有所帮助