Определение маршрута в промежуточном программном обеспечении
Кто-нибудь знает, возможно ли получить путь, используемый для запуска маршрута?
Например, скажем, у меня есть это:
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
работает просто отлично!
Надеюсь это поможет