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 ??
Après avoir moi-même joué un peu, vous devriez utiliser:
console.log(req.originalUrl)
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
CA devrait etre:
req.url
express 3.1.x
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();
}
});
//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!
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();
}
});
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
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;