So erhalten Sie den Anforderungspfad mit dem Express Req-Objekt

158

Ich verwende express + node.js und habe ein req-Objekt. Die Anfrage im Browser lautet / account, aber wenn ich req.path protokolliere, erhalte ich '/' --- not '/ 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();
    }
  });

req.path ist / wann sollte es sein / account ??

chovy
quelle
2
TypeError: Cannot read property 'path' of undefined
Chovy
req.route.path ist korrekt und hier dokumentiert . Welche Express-Version verwenden Sie?
Zemirco
Ich habe das gleiche Problem. req.routeist nicht definiert. Ich benutze Express 3.4.4. Was kann dazu führen, dass die Route undefiniert ist?
Davidpfahler
@vinayr req.route.path gibt mir immer noch / create anstelle von / quizzes / create, das ist die gesamte URL
Sandip Subedi
Dies ist beabsichtigtes Verhalten. Und du solltest es annehmen. Ihr Handler sollte sich nicht um den vollständigen Pfad kümmern, sondern nur um den "lokalen" Teil des Pfads. Das ist der Teil nach dem Pfad, auf dem es montiert wurde. Dies erleichtert die Wiederverwendung der Handlerfunktion in anderen Kontexten.
Stijn de Witt

Antworten:

234

Nachdem Sie selbst ein bisschen gespielt haben, sollten Sie Folgendes verwenden:

console.log(req.originalUrl)

Menztrual
quelle
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 auch mit zusätzlichen Routern in Express 4. Wenn einer von beiden von einem bestimmten Pfad abgehängt wird, kann er in sich selbst so tun, als ob er von der Wurzel abweicht. Das ist gut für die Isolation, aber schwierig, wenn Sie nicht wissen, wie Sie den ursprünglichen vollen Wert erhalten können. Danke, dass du das gepostet hast!
Juanpaco
3
Wenn Sie mit 4.0 hierher kommen, ist req.url so konzipiert, dass es von Middleware für Umleitungszwecke geändert werden kann. Je nachdem, wo es aufgerufen wird, fehlen in req.path möglicherweise Einhängepunkte. expressjs.com/en/api.html#req.originalUrl
Christian Davis
3
Wenn Sie nicht möchten, dass die Abfragezeichenfolge enthalten ist:const path = req.originalUrl.replace(/\?.*$/, '');
Adam Reis
1
Warnung: Dies ist eine irreführende Antwort, die auf der OP-Frage basiert. Dies gibt auch die Abfragezeichenfolge zurück (z. B.? A = b & c = 5), falls vorhanden. Siehe expressjs.com/en/api.html#req.originalUrl
Ciabaros
60

In einigen Fällen sollten Sie Folgendes verwenden:

req.path

Dies gibt Ihnen den Pfad anstelle der vollständig angeforderten URL. Wenn Sie beispielsweise nur daran interessiert sind, welche Seite der Benutzer angefordert hat und nicht alle Arten von Parametern, die URL:

/myurl.htm?allkinds&ofparameters=true

req.path gibt Ihnen:

/myurl.html
DivZero
quelle
1
Achten Sie darauf, dass bei Überprüfungen dieser URL auch eine Überprüfung auf einen abschließenden Schrägstrich erfolgt, wenn diese in Ihrer App gültig ist. (dh das Überprüfen auf /demosollte möglicherweise auch nach prüfen /demo/).
Vinay
Wenn Sie nicht möchten, dass die Abfragezeichenfolge enthalten ist: const path = req.originalUrl.replace (/\?.*$/, '');
Adam Reis
req.pathist die Abkürzung von url.parse(req.url).pathnameund dies sollte die akzeptierte Antwort sein
am
1
@sertsedat Falsch. req.pathGibt Ihnen den relativen Pfad zu dem Ort an, an dem Ihre App bereitgestellt wird. Wenn es an der Wurzel gemountet ist, ist dies korrekt, aber für einen Pfad /my/pathinnerhalb einer App, die an gemountet ist /my, req.urlwird angegeben /path.
Stijn de Witt
21

Als Ergänzung finden Sie hier ein Beispiel aus der Dokumentation, das alles, was Sie über den Zugriff auf die Pfade / URLs wissen müssen, in jedem Fall mit Express gut zusammenfasst:

app.use('/admin', function (req, res, next) { // GET 'http://www.example.com/admin/new?a=b'
  console.dir(req.originalUrl) // '/admin/new?a=b' (WARNING: beware query string)
  console.dir(req.baseUrl) // '/admin'
  console.dir(req.path) // '/new'
  console.dir(req.baseUrl + req.path) // '/admin/new' (full path without query string)
  next()
})

Basierend auf: https://expressjs.com/en/api.html#req.originalUrl

Schlussfolgerung: Wie in der obigen Antwort von c1moore angegeben , verwenden Sie:

var fullPath = req.baseUrl + req.path;
Ciabaros
quelle
11

Es sollte sein:

req.url

Express 3.1.x.

Jürgen Paul
quelle
req.url ist keine native Express-Eigenschaft, sondern wird vom http-Modul von Node geerbt: expressjs.com/en/api.html#req.originalUrl
Megagator
9
//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 ist / wann sollte es sein / account ??

Der Grund dafür ist, dass Express den Pfad subtrahiert, auf dem Ihre Handlerfunktion bereitgestellt ist, '/account'in diesem Fall.

Warum machen sie das?

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

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

Dann können Sie es an mehreren Endpunkten bereitstellen:

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

Geben:

/world           ==>  Hello there!
/world/goodbye   ==>  Farewell!
/aliens          ==>  Hello there!
/aliens/goodbye  ==>  Farewell!
Stijn de Witt
quelle
9

Wenn Sie wirklich nur "Pfad" ohne Querystring erhalten möchten, können Sie die urlBibliothek verwenden, um nur den Pfad als Teil der URL zu analysieren und abzurufen .

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();
    }
});
Murat Çorlu
quelle
Genau das will ich. Verwenden Sie es mit, req.query.refwenn die Anmeldung erfolgreich ist
Ryan Wu
Dies funktioniert gut mit universellem Code, da er der Standortspezifikation entspricht . Weniger Dinge zu beachten und einfacher zu testen auf Client und Server.
Cchamberlain
req.pathist nur ein Alias ​​fürurl.parse(req.url).pathname
mhodges
8

Für Version 4.x können Sie jetzt req.baseUrlzusätzlich den verwenden req.path, um den vollständigen Pfad abzurufen. Zum Beispiel würde das OP jetzt so etwas tun:

//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();
  }
});
c1moore
quelle
5

req.route.path arbeitet für mich

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 der Ausführung sehe ich Folgendes in der Konsole und erhalte ein perfektes Ergebnis in meinem Browser.

Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
Bahman.A
quelle