Ответ 1
После того, как вы сыграете немного, вы должны использовать:
console.log(req.originalUrl)
Я использую express + node.js, и у меня есть объект req, запрос в браузере есть /account, но когда я регистрирую req.path, я получаю '/' --- not '/account'.
//auth required or redirect
app.use('/account', function(req, res, next) {
console.log(req.path);
if ( !req.session.user ) {
res.redirect('/login?ref='+req.path);
} else {
next();
}
});
req.path есть/когда он должен быть/account??
После того, как вы сыграете немного, вы должны использовать:
console.log(req.originalUrl)
В некоторых случаях вы должны использовать:
req.path
Это дает вам путь, а не полный запрошенный URL. Например, если вас интересует только страница, которую запрашивал пользователь, а не все виды параметров, url:
/myurl.htm?allkinds&ofparameters=true
req.path даст вам:
/myurl.html
Это должно быть:
req.url
express 3.1.x
Если вы хотите действительно получить только "путь" без запроса, вы можете использовать библиотеку url
для синтаксического анализа и получить только путь к URL-адресу.
var url = require('url');
//auth required or redirect
app.use('/account', function(req, res, next) {
var path = url.parse(req.url).pathname;
if ( !req.session.user ) {
res.redirect('/login?ref='+path);
} else {
next();
}
});
//auth required or redirect
app.use('/account', function(req, res, next) {
console.log(req.path);
if ( !req.session.user ) {
res.redirect('/login?ref='+req.path);
} else {
next();
}
});
req.path есть/когда он должен быть /account??
Причиной этого является то, что Express вычитает путь, на который установлена ваша функция обработчика, которая в этом случае '/account'
.
Почему они это делают?
Потому что это облегчает повторное использование функции обработчика. Вы можете сделать функцию обработчика, которая делает разные вещи для req.path === '/'
и req.path === '/goodbye'
, например:
function sendGreeting(req, res, next) {
res.send(req.path == '/goodbye' ? 'Farewell!' : 'Hello there!')
}
Затем вы можете подключить его к нескольким конечным точкам:
app.use('/world', sendGreeting)
app.use('/aliens', sendGreeting)
Дарение:
/world ==> Hello there!
/world/goodbye ==> Farewell!
/aliens ==> Hello there!
/aliens/goodbye ==> Farewell!
req.route.path работает для меня
var pool = require('../db');
module.exports.get_plants = function(req, res) {
// to run a query we can acquire a client from the pool,
// run a query on the client, and then return the client to the pool
pool.connect(function(err, client, done) {
if (err) {
return console.error('error fetching client from pool', err);
}
client.query('SELECT * FROM plants', function(err, result) {
//call `done()` to release the client back to the pool
done();
if (err) {
return console.error('error running query', err);
}
console.log('A call to route: %s', req.route.path + '\nRequest type: ' + req.method.toLowerCase());
res.json(result);
});
});
};
после выполнения я вижу в консоли следующее: я получаю отличный результат в моем браузере.
Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
res.redirect(req.header('referrer'));
будет перенаправлен на текущий адрес URL.
Для версии 4.x теперь вы можете использовать req.baseUrl
в дополнение к req.path
, чтобы получить полный путь. Например, OP теперь сделает что-то вроде:
//auth required or redirect
app.use('/account', function(req, res, next) {
console.log(req.baseUrl + req.path); // => /account
if(!req.session.user) {
res.redirect('/login?ref=' + encodeURIComponent(req.baseUrl + req.path)); // => /login?ref=%2Faccount
} else {
next();
}
});