web-dev-qa-db-fra.com

comment obtenir un chemin de requête avec un objet express req

J'utilise express + node.js et j'ai un objet req. La requête dans le navigateur est/compte, mais lorsque je me connecte à req.path, j'obtiens '/' --- pas '/ compte'.

  //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 est/quand il devrait être/compte ??

124
chovy

Après avoir moi-même joué un peu, vous devriez utiliser:

console.log(req.originalUrl)

195
Menztrual

Dans certains cas, vous devriez utiliser:

req.path

Cela vous donne le chemin, au lieu de l'URL complète demandée. Par exemple, si vous êtes uniquement intéressé par la page demandée par l'utilisateur et non par tous les types de paramètres, l'URL:

/myurl.htm?allkinds&ofparameters=true

req.path vous donnera:

/myurl.html
44
DivZero

CA devrait etre:

req.url

express 3.1.x

11
Jürgen Paul

Si vous voulez vraiment obtenir uniquement "chemin" sans chaîne de requête, vous pouvez utiliser la bibliothèque url pour analyser et obtenir uniquement la partie chemin de l'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();
    }
});
9
Murat Çorlu
//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 est/quand il devrait être/compte ??

La raison en est que Express soustrait le chemin sur lequel votre fonction de gestionnaire est montée, qui est '/account' dans ce cas.

Pourquoi font-ils cela?

Parce que cela facilite la réutilisation de la fonction de gestionnaire. Vous pouvez créer une fonction de gestionnaire faisant différentes choses pour req.path === '/' et req.path === '/goodbye', par exemple:

function sendGreeting(req, res, next) {
  res.send(req.path == '/goodbye' ? 'Farewell!' : 'Hello there!')
}

Ensuite, vous pouvez le monter sur plusieurs points de terminaison:

app.use('/world', sendGreeting)
app.use('/aliens', sendGreeting)

Donnant:

/world           ==>  Hello there!
/world/goodbye   ==>  Farewell!
/aliens          ==>  Hello there!
/aliens/goodbye  ==>  Farewell!
8
Stijn de Witt

Pour la version 4.x, vous pouvez maintenant utiliser le req.baseUrl en plus de req.path pour obtenir le chemin complet. Par exemple, le PO ferait maintenant quelque chose comme:

//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();
  }
});
6
c1moore

req.route.path travaille pour moi

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

après exécution, la console affiche les informations suivantes et le résultat est parfait dans mon navigateur.

Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
4
Bahman.A

Pour compléter, voici un exemple développé à partir de la documentation, qui résume bien tout ce que vous devez savoir sur l’accès aux chemins/URL dans tous les cas avec express:

app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?a=b'
  console.dir(req.originalUrl) // '/admin/new?a=b' (WARNING: beware query string)
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  console.dir(req.baseUrl + req.path) // '/admin/new' (full path without query string)
  next()
})

Basé sur: https://expressjs.com/en/api.html#req.originalUrl

Conclusion: Comme la réponse de c1moore indique ci-dessus, utilisez:

var fullPath = req.baseUrl + req.path;
3
Ciabaros