2012-09-21 98 views
70

我使用express + node.js和我有一個req對象,在瀏覽器中的請求是/帳戶,但是當我登錄req.path我得到'/' - - 不是'/賬戶'。如何獲得請求路徑與快遞請求對象

//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?

+3

嘗試'req.route.path' – vinayr

+2

'類型錯誤:undefined' – chovy

+0

req.route.path無法讀取屬性「路徑」是正確的和記錄[點擊這裏](http://expressjs.com/api.html#req.route)。您使用哪種版本的快遞? – zemirco

回答

116

有一點的發揮自己後,你應該使用:

console.log(req.originalUrl)

+0

仍然不清楚爲什麼req.path不能正常工作。 – chovy

+3

我認爲它與中間件的定位有關,但你是對的,它沒有意義。 – Menztrual

+1

這絕對是中間件。 Express 4中的其他路由器也會發生這種情況。當任何一條路徑離開給定的路徑時,它本身就會假裝它已經離開了根目錄。這對隔離很好,但當你不知道如何獲得最初的完整價值時會很棘手。感謝張貼這! – juanpaco

8

它應該是:

req.url

快遞3.1.X

32

在某些情況下,你應該使用:

req.path 

這會爲您提供路徑,而不是完整的請求URL。例如,如果你只在頁面的用戶請求和感興趣的不是各種參數的網址:

/myurl.htm?allkinds&ofparameters=true 

req.path會給你:

/myurl.html 
+0

請注意,如果您正在對此網址進行檢查,以便在應用中包含對於尾部斜槓的檢查。 (即檢查'/ demo'也應該檢查'/ demo /')。 – Vinay

9

如果你想真正得到只有「路徑」沒有查詢字符串,您可以使用url庫來解析並獲取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(); 
    } 
}); 
+0

這正是我想要的。如果登錄成功,請使用'''req.query.ref'''。 –

+0

由於符合[位置](https://developer.mozilla.org/en-US/docs/Web/ API /位置)規範。更少的事情要記住,並更容易跨客戶端和服務器進行單元測試。 – cchamberlain

3

req.route.path is working for me

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 
5
//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 is/when it should be /account ??

這樣做的原因是,快速減去你的處理功能被安裝在道路,這是在這種情況下'/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! 
0
res.redirect(req.header('referrer')); 

將重定向到當前的URL地址。

0

對於版本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(); 
    } 
});