Подтвердить что ты не робот

Как получить путь запроса с выражением req object

Я использую 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??

4b9b3361

Ответ 1

После того, как вы сыграете немного, вы должны использовать:

console.log(req.originalUrl)

Ответ 2

В некоторых случаях вы должны использовать:

req.path

Это дает вам путь, а не полный запрошенный URL. Например, если вас интересует только страница, которую запрашивал пользователь, а не все виды параметров, url:

/myurl.htm?allkinds&ofparameters=true

req.path даст вам:

/myurl.html

Ответ 3

Это должно быть:

req.url

express 3.1.x

Ответ 4

Если вы хотите действительно получить только "путь" без запроса, вы можете использовать библиотеку 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();
    }
});

Ответ 5

//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!

Ответ 6

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

Ответ 7

res.redirect(req.header('referrer'));

будет перенаправлен на текущий адрес URL.

Ответ 8

Для версии 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();
  }
});