Определение маршрута в промежуточном программном обеспечении

Кто-нибудь знает, возможно ли получить путь, используемый для запуска маршрута?

Например, скажем, у меня есть это:

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

При использовании следующего простого промежуточного программного обеспечения

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

Я хочу иметь возможность получить /user/:id в промежуточном программном обеспечении, это не req.url.

Ответ 1

Вы хотите 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


EDIT:

Как поясняется в комментариях, получение req.route в промежуточном программном обеспечении затруднено/хаки. Промежуточное ПО маршрутизатора - это тот, который заполняет объект req.route, и он, вероятно, находится на более низком уровне, чем промежуточное программное обеспечение, которое вы разрабатываете.

Таким образом, получение req.route возможно только в том случае, если вы подключаетесь к промежуточному программному обеспечению маршрутизатора для синтаксического анализа req для вас перед его выполнением самим Express.

Ответ 2

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

Ответ 3

Этот неприятный трюк с использованием переопределения прототипа поможет

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

Ответ 4

req.route.path будет работать, чтобы получить путь для данного маршрута. Но если вы хотите полный путь, включая путь родительского маршрута, используйте что-то вроде

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

Надеюсь, поможет

Ответ 5

Я знаю, что это немного поздно, но для последующих настроек Express/Node req.originalUrl работает просто отлично!

Надеюсь это поможет