webentwicklung-frage-antwort-db.com.de

Wie erhalte ich die vollständige URL in Express?

Angenommen, meine Beispiel-URL lautet

http://example.com/one/two

und ich sage ich habe den folgenden weg

app.get('/one/two', function (req, res) {
    var url = req.url;
}

Der Wert von url ist /one/two.

Wie erhalte ich die vollständige URL in Express? Im obigen Fall möchte ich beispielsweise http://example.com/one/two erhalten.

420
Chris Abrams
  1. Das Protokoll ist als req.protocol verfügbar. docs hier

    1. Vor Express 3.0 können Sie davon ausgehen, dass das Protokoll http ist, es sei denn, Sie sehen, dass req.get('X-Forwarded-Protocol') gesetzt ist und den Wert https hat. In diesem Fall wissen Sie, dass dies Ihr Protokoll ist
  2. Der Host kommt von req.get('Host'), wie Gopal angegeben hat

  3. Hoffentlich benötigen Sie keinen nicht standardmäßigen Port in Ihren URLs, aber wenn Sie ihn kennen müssten, hätten Sie ihn in Ihrem Anwendungsstatus, da er alles ist, was Sie beim Serverstart an app.listen übergeben haben. Bei lokaler Entwicklung auf einem Nicht-Standard-Port scheint Chrome den Port in den Host-Header aufzunehmen, sodass req.get('Host') beispielsweise localhost:3000 zurückgibt. Zumindest für den Fall, dass eine Produktionsstätte an einem Standard-Port betrieben wird und Sie direkt zu Ihrer Express-App navigieren (ohne Reverse-Proxy), scheint der Host -Header in Bezug auf den Port in der URL das Richtige zu tun.

  4. Der Pfad kommt von req.originalUrl (danke @pgrassant). Beachten Sie, dass dies die Abfragezeichenfolge enthält. docs hier auf req.url und req.originalUrl . Abhängig davon, was Sie mit der URL tun möchten, kann originalUrl im Vergleich zu req.url den richtigen Wert haben oder nicht.

Kombinieren Sie diese zusammen, um die absolute URL zu rekonstruieren.

  var fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl;
648
Peter Lyons

Anstatt die Dinge auf eigene Faust zusammenzufügen, können Sie stattdessen die node.js-API für URLs verwenden und URL.format() die Informationen von express übergeben.

Beispiel:

var url = require('url');

function fullUrl(req) {
  return url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl
  });
}
112
Michael Weibel

Ich fand es ein bisschen wie eine PITA, die angeforderte URL zu bekommen. Ich kann nicht glauben, dass es im Express keinen einfacheren Weg gibt. Sollte nur req.requested_url sein

Aber so stelle ich es ein:

var port = req.app.settings.port || cfg.port;
res.locals.requested_url = req.protocol + '://' + req.Host  + ( port == 80 || port == 443 ? '' : ':'+port ) + req.path;
32
chovy

Verwenden von rl.format :

var url = require('url');

Dies unterstützt alle Protokolle und beinhaltet die Portnummer. Wenn Ihre originalUrl keine Abfragezeichenfolge enthält, können Sie diese saubere Lösung verwenden:

var requrl = url.format({
    protocol: req.protocol,
    Host: req.get('Host'),
    pathname: req.originalUrl,
});

Wenn Sie eine Abfragezeichenfolge haben:

var urlobj = url.parse(req.originalUrl);
urlobj.protocol = req.protocol;
urlobj.Host = req.get('Host');
var requrl = url.format(urlobj);
17
mpolci

Hier ist eine großartige Möglichkeit, eine Funktion hinzuzufügen, die Sie für das req-Objekt aufrufen können, um die URL abzurufen

  app.use(function(req, res, next) {
    req.getUrl = function() {
      return req.protocol + "://" + req.get('Host') + req.originalUrl;
    }
    return next();
  });

Jetzt haben Sie eine Funktion, die Sie bei Bedarf aufrufen können.

15

Benutze das,

var url = req.headers.Host + '/' + req.url;
9
Vaghani Janak

damit req.Host/req.hostname wirksam wird, müssen zwei Bedingungen erfüllt sein, wenn Express hinter Proxies :

  1. app.set('trust proxy', 'loopback'); in app.js
  2. Der Header X-Forwarded-Host muss von Ihnen im Webserver angegeben werden. z.B. Apache, Nginx

nginx :

server {
    listen myhost:80;
    server_name  myhost;
    location / {
        root /path/to/myapp/public;
        proxy_set_header X-Forwarded-Host $Host:$server_port;
        proxy_set_header X-Forwarded-Server $Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://myapp:8080;
    }
}

Apache :

<VirtualHost myhost:80>
    ServerName myhost
    DocumentRoot /path/to/myapp/public
    ProxyPass / http://myapp:8080/
    ProxyPassReverse / http://myapp:8080/
</VirtualHost>
9
zhi.yang
var full_address = req.protocol + "://" + req.headers.Host + req.originalUrl;

oder

var full_address = req.protocol + "://" + req.headers.Host + req.baseUrl;
6
mlibre

Ich würde vorschlagen, originalUrl anstelle von URL zu verwenden:

var url = req.protocol + '://' + req.get('Host') + req.originalUrl;

Die Beschreibung von originalUrl finden Sie hier: http://expressjs.com/api.html#req.originalUrl

In unserem System machen wir so etwas, also ist uns originalUrl wichtig:

  foo = express();
  express().use('/foo', foo);
  foo.use(require('/foo/blah_controller'));

blah_controller sieht so aus:

  controller = express();
  module.exports = controller;
  controller.get('/bar/:barparam', function(req, res) { /* handler code */ });

Unsere URLs haben also das Format:

www.example.com/foo/bar/:barparam

Daher benötigen wir req.originalUrl im Barcontroller-Get-Handler.

6
Amber Haq Dixon

Mein Code sieht so aus,

params['Host_url'] = req.protocol + '://' + req.headers.Host + req.url;

6
soomtong

Sie müssen es mit req.headers.Host + req.url erstellen. Wenn du in einem anderen Hafen hostest und so kommst du natürlich auf die Idee ;-)

6
g13n

Ich benutze das Node Package 'url' (npm install url)

Was es tut, ist, wenn Sie anrufen

url.parse(req.url, true, true)

es gibt Ihnen die Möglichkeit, die URL ganz oder teilweise abzurufen. Weitere Informationen hier: https://github.com/defunctzombie/node-url

Ich habe es folgendermaßen verwendet, um alles, was nach dem/in http://www.example.com/ kommt, als Variable zu verwenden und ein bestimmtes Profil aufzurufen (eine Art wie Facebook: - http://www.facebook.com/username )

    var url = require('url');
    var urlParts = url.parse(req.url, true, true);
    var pathname = urlParts.pathname;
    var username = pathname.slice(1);

Damit dies funktioniert, müssen Sie Ihre Route folgendermaßen in Ihrer server.js-Datei erstellen:

self.routes['/:username'] = require('./routes/users');

Und stellen Sie Ihre Routendatei so ein:

router.get('/:username', function(req, res) {
 //here comes the url parsing code
}
5
Sacha Nacar

Ich habe tatsächlich herausgefunden, dass Sie mit diesem Code unten Ihre URL erhalten können. Dann schneiden Sie es in Scheiben und entscheiden, was als nächstes kommt.

app.use(function(req, res, next) {
console.log(req.originalUrl);
res.send(req.originalUrl);
  });
1
Kennedy Nyaga

Vielen Dank für diese Informationen. Das ist unglaublich nervig.

Fügen Sie dies Ihrem Code hinzu und Sie müssen nie wieder darüber nachdenken:

var app = express();

app.all("*", function (req, res, next) {  // runs on ALL requests
    req.fullUrl = req.protocol + '://' + req.get('Host') + req.originalUrl
        next()
})

Sie können dort auch andere Aktionen ausführen oder festlegen, z. B. die Protokollierung in der Konsole.

0
Nico