如何获得快递请求对象的请求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是/当它应该/帐户?

       

网上收集的解决方案 "如何获得快递请求对象的请求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(); } });