如何获得快递请求对象的请求path
我使用express + node.js,我有一个req对象,在浏览器中的请求是/帐户,但是当我loginreq.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(); } });
请求path是/当它应该/帐户?
在玩了一下自己之后,你应该使用:
console.log(req.originalUrl)
在某些情况下,您应该使用:
req.path
这给你的path,而不是完整的请求的URL。 例如,如果您只对用户请求的哪个页面感兴趣,而不是所有types的参数url:
/myurl.htm?allkinds&ofparameters=true
req.path会给你:
/myurl.html
它应该是:
req.url
expression3.1.x
如果你想真正得到没有查询string的“path”,你可以使用url
库parsing,并获得只有path部分的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(); } });
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
//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(); } });
请求path是/当它应该是/帐户?
原因是Express会减去你的处理函数被挂载的path,在这种情况下是'/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!
res.redirect(req.header('referrer'));
将redirect到当前的URL地址。
对于4.x版本,您现在可以使用req.baseUrl
以及req.path
来获取完整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(); } });