19

有谁知道是否有可能获得用于触发路线的路径?

例如,假设我有这个:

app.get('/user/:id', function(req, res) {});

使用以下简单的中间件

function(req, res, next) {
     req.?
});

我希望能够进入/user/:id中间件,这不是req.url.

4

5 回答 5

27

你想要的是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中间件是困难的/hacky。路由器中间件是填充req.route对象的中间件,它可能处于比您正在开发的中间件更低的级别。

这样,只有在 Express 本身执行之前,req.route您连接到路由器中间件为您解析,才能获取。req

于 2013-10-18T23:35:17.530 回答
14

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) { ... });
于 2013-10-22T14:38:59.857 回答
2

这个使用原型覆盖的讨厌技巧将有所帮助

   "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);
        };
    };
于 2016-03-20T13:27:48.013 回答
2

我知道这有点晚了,但是对于以后的 Express/Node 设置req.originalUrl工作得很好!

希望这可以帮助

于 2019-06-19T20:20:08.087 回答
0

req.route.path将努力获取给定路线的路径。但是,如果您想要包含父路由路径的完整路径,请使用类似

let full_path = req.baseUrl+req.route.path;

希望能帮助到你

于 2018-11-27T19:40:57.487 回答