2012-09-21 2 views
70

Ich benutze Express + node.js und ich habe ein req-Objekt, die Anfrage im Browser ist/account, aber wenn ich req.path log ich bekomme '/' - - Nicht '/ Konto'.Wie man Anfrage Pfad mit ausdrücklichen req Objekt

req.path ist/wann sollte/account ??

+3

Versuch 'req.route.path' – vinayr

+2

' Typeerror: kann Eigenschaft ‚Pfad‘ von undefined' – chovy

+0

req.route.path richtig gelesen und dokumentiert [hier ] (http://expressjs.com/api.html#req.route). Welche Version von Express verwenden Sie? – zemirco

Antwort

116

Nach ein bisschen ein selbst spielen, sollten Sie verwenden:

console.log(req.originalUrl)

+0

immer noch nicht klar, warum req.path nicht so funktioniert, wie es sollte. – chovy

+3

Ich denke, es hat etwas mit der Positionierung von Middleware zu tun, aber Sie haben Recht, es macht keinen Sinn. – Menztrual

+1

Es ist definitiv die Middleware. Dies geschieht mit zusätzlichen Routern in Express 4. Wenn eines von einem bestimmten Pfad entfernt ist, wird es in sich selbst so vorgetäuscht, dass es von der Wurzel entfernt ist. Das ist gut für die Isolation, aber schwierig, wenn Sie nicht wissen, wie Sie den ursprünglichen vollen Wert erhalten. Danke für das Posten! – juanpaco

8

Es sollte:

req.url

express 3.1.x

32

In einigen Fällen Sie sollten verwenden:

req.path 

Dies gibt Ihnen den Pfad anstelle der vollständigen angeforderten URL. So sind zum Beispiel, wenn Sie nur, in welcher Seite interessiert der Benutzer aufgefordert und nicht alle Arten von Parametern die URL:

/myurl.htm?allkinds&ofparameters=true 

req.path Sie geben:

/myurl.html 
+0

Achten Sie darauf, dass bei Überprüfungen dieser URL auch ein Häkchen für einen nachgestellten Schrägstrich eingefügt wird, wenn dieser in Ihrer App gültig ist. (d. h. die Überprüfung auf '/ demo' sollte auch nach'/demo/'suchen). – Vinay

9

Wenn Sie wirklich wollen, bekommen Nur "Pfad" ohne Querystring, können Sie url Bibliothek zu parsen und erhalten nur Pfad Teil der 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

das ist genau das, was ich will. Verwenden Sie es mit '' 'req.query.ref''', wenn die Anmeldung erfolgreich war –

+0

Dies funktioniert gut mit universellem Code, da es [Ort] entspricht (https://developer.mozilla.org/en-US/docs/Web/ API/Standort) spez. Weniger Dinge, an die Sie sich erinnern können und die einfacher über Client und Server hinweg getestet werden können. – 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); 
     }); 
    }); 
}; 

nach dem Ausführen Ich sehe in der Konsole die folgende und ich perfektes Ergebnis in meinem Browser bekommen.

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

Der Grund dafür ist, dass Express den Weg Ihre Handler-Funktion subtrahiert auf montiert, die '/account' in diesem Fall ist.

Warum machen sie das?

Weil es die Wiederverwendung der Handler-Funktion erleichtert. Sie können eine Handler-Funktion machen, die verschiedene Dinge für req.path === '/' und req.path === '/goodbye' zum Beispiel tut:

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

Dann können Sie es an mehrere Endpunkte montieren:

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')); 

wird zur aktuellen URL-Adresse umgeleitet.

0

Für Version 4.x Sie können nun req.baseUrl zusätzlich zu req.path verwenden, um den vollständigen Pfad zu erhalten. Zum Beispiel würde die OP tun jetzt so etwas wie:

//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(); 
    } 
}); 
Verwandte Themen