我使用express + node.js并且我有一个req对象,浏览器中的请求是/ account但是当我记录req.path时我会得到' /' ---不是' / 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 ??
答案 0 :(得分:181)
自己玩了一下后,你应该使用:
console.log(req.originalUrl)
答案 1 :(得分:42)
在某些情况下,您应该使用:
req.path
这为您提供了路径,而不是完整请求的URL。例如,如果您只对用户请求的页面感兴趣而不是所有类型的参数url:
/myurl.htm?allkinds&ofparameters=true
req.path会给你:
/myurl.html
答案 2 :(得分:10)
应该是:
req.url
表达3.1.x
答案 3 :(得分:9)
如果你想真正只获得没有查询字符串的“路径”,你可以使用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();
}
});
答案 4 :(得分:8)
//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!
答案 5 :(得分:6)
对于版本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();
}
});
答案 6 :(得分:4)
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 :(得分:1)
作为补充,这是从文档扩展而来的示例,该示例很好地包装了您需要在所有情况下使用express来访问路径/ URL的所有知识:
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()
})
基于:https://expressjs.com/en/api.html#req.originalUrl
结论:如上面的c1moore's answer所述,请使用:
var fullPath = req.baseUrl + req.path;
答案 8 :(得分:-2)
res.redirect(req.header('referrer'));
将重定向到当前网址。