2012-09-21 25 views
70

Tôi đang sử dụng express + node.js và tôi có đối tượng req, yêu cầu trong trình duyệt là/account nhưng khi tôi đăng nhập req.path tôi nhận được '/' - - không phải '/ tài khoản'.cách nhận đường dẫn yêu cầu với đối tượng phản hồi nhanh

//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 là/khi cần/tài khoản ??

+3

thử 'req.route.path' – vinayr

+2

' Lỗi Loại: Không thể đọc thuộc 'con đường' của undefined' – chovy

+0

req.route.path là chính xác và tài liệu [ở đây ] (http://expressjs.com/api.html#req.route). Bạn đang sử dụng phiên bản Express nào? – zemirco

Trả lời

116

Sau khi có một chút của một chơi bản thân mình, bạn nên sử dụng:

console.log(req.originalUrl)

+0

vẫn chưa rõ lý do tại sao req.path không hoạt động như mong muốn. – chovy

+3

Tôi nghĩ rằng nó có một cái gì đó để làm với vị trí của middleware, nhưng bạn là chính xác, nó không có ý nghĩa. – Menztrual

+1

Đó chắc chắn là phần mềm trung gian. Điều này cũng xảy ra với các router bổ sung trong Express 4. Khi một trong hai được gắn kết của một con đường nhất định, bên trong chính nó nó được giả vờ rằng nó ra khỏi thư mục gốc. Đó là tốt đẹp cho sự cô lập, nhưng khó khăn khi bạn không biết làm thế nào để có được những gì giá trị đầy đủ ban đầu được. Cảm ơn bạn đã đăng bài này! – juanpaco

32

Trong một số trường hợp bạn nên sử dụng:

req.path 

Điều này cung cấp cho bạn đường dẫn thay vì URL được yêu cầu hoàn chỉnh. Ví dụ, nếu bạn chỉ quan tâm đến trang nào người dùng được yêu cầu và không phải tất cả các loại thông số url:

/myurl.htm?allkinds&ofparameters=true 

req.path sẽ cung cấp cho bạn:

/myurl.html 
+0

Hãy cẩn thận nếu bạn đang thực hiện kiểm tra đối với URL này cũng bao gồm dấu kiểm cho dấu gạch chéo nếu nó hợp lệ trong ứng dụng của bạn. (ví dụ: kiểm tra '/ demo' cũng có thể kiểm tra'/demo/'). – Vinay

9

Nếu bạn muốn thực sự có được chỉ "đường dẫn" không có chuỗi truy vấn, bạn có thể sử dụng thư viện url để phân tích cú pháp và chỉ lấy một phần đường dẫn của 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

chính xác đây là những gì tôi muốn. Sử dụng nó với '' 'req.query.ref''' nếu đăng nhập thành công –

+0

Điều này làm việc độc đáo với mã phổ quát vì nó phù hợp với [Vị trí] (https://developer.mozilla.org/en-US/docs/Web/ API/Vị trí) spec. Ít điều cần nhớ và dễ dàng hơn để kiểm tra đơn vị trên máy khách và máy chủ. – 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); 
     }); 
    }); 
}; 

sau khi thực hiện tôi thấy sau trong giao diện điều khiển và tôi nhận được kết quả hoàn hảo trong trình duyệt của mình.

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

Lý do cho điều này là nhanh trừ con đường chức năng xử lý của bạn được gắn trên, đó là '/account' trong trường hợp này.

Tại sao họ thực hiện việc này?

Bởi vì nó giúp dễ dàng sử dụng lại chức năng xử lý. Bạn có thể thực hiện một chức năng xử lý mà làm những việc khác nhau cho req.path === '/'req.path === '/goodbye' ví dụ:

function sendGreeting(req, res, next) { 
    res.send(req.path == '/goodbye' ? 'Farewell!' : 'Hello there!') 
} 

Sau đó, bạn có thể gắn nó cho nhiều thiết bị đầu cuối:

app.use('/world', sendGreeting) 
app.use('/aliens', sendGreeting) 

Giving:

/world   ==> Hello there! 
/world/goodbye ==> Farewell! 
/aliens   ==> Hello there! 
/aliens/goodbye ==> Farewell! 
0
res.redirect(req.header('referrer')); 

sẽ chuyển hướng đến địa chỉ url hiện tại.

0

Dành cho phiên bản 4.x bây giờ bạn có thể sử dụng req.baseUrl ngoài req.path để có đường dẫn đầy đủ. Ví dụ, bây giờ OP sẽ làm điều gì đó như:

//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(); 
    } 
}); 
Các vấn đề liên quan