with route req query parse parameter node node.js url express

node.js - route - ¿Cómo obtener la url completa en Express?



req.query express (13)

  1. El protocolo está disponible como req.protocol . docs aquí

    1. Antes de Express 3.0, el protocolo puede asumir que es http menos que vea que req.get(''X-Forwarded-Protocol'') está establecido y tiene el valor https , en cuyo caso sabe que ese es su protocolo.
  2. El host proviene de req.get(''host'') como Gopal ha indicado

  3. Es de esperar que no necesite un puerto no estándar en sus URL, pero si necesita saberlo, lo tendrá en su estado de aplicación porque es lo que pasó a app.listen en el momento de inicio del servidor. Sin embargo, en el caso del desarrollo local en un puerto no estándar, Chrome parece incluir el puerto en el encabezado del host, por lo que req.get(''host'') devuelve localhost:3000 , por ejemplo. Entonces, al menos para los casos de un sitio de producción en un puerto estándar y para navegar directamente a su aplicación Express (sin proxy inverso), el encabezado del host parece hacer lo correcto con respecto al puerto en la URL.

  4. El camino proviene de req.originalUrl (gracias @pgrassant). Tenga en cuenta que esto incluye la cadena de consulta. docs aquí en req.url y req.originalUrl . Dependiendo de lo que intente hacer con la URL, originalUrl puede o no ser el valor correcto en comparación con req.url .

Combina todos juntos para reconstruir la URL absoluta.

var fullUrl = req.protocol + ''://'' + req.get(''host'') + req.originalUrl;

Digamos que mi url de muestra es

http://example.com/one/two

y digo que tengo la siguiente ruta

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

El valor de url será /one/two .

¿Cómo obtengo la url completa en Express? Por ejemplo, en el caso anterior, me gustaría recibir http://example.com/one/two .


De hecho, descubrí que al usar este código a continuación puedes obtener tu url. Luego procede a cortarlo y decidir qué es lo siguiente.

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


En lugar de concatenar las cosas por su cuenta, puede utilizar la API node.js para las URL y pasar la URL.format() las informaciones de Express.

Ejemplo:

var url = require(''url''); function fullUrl(req) { return url.format({ protocol: req.protocol, host: req.get(''host''), pathname: req.originalUrl }); }


Encontré un poco de un PITA para obtener la url solicitada. No puedo creer que no haya una manera más fácil de expresar. Debería ser req.requested_url

Pero así es como lo configuro:

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


Esta es una excelente manera de agregar una función a la que puede llamar en el objeto req para obtener la url

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

Ahora tiene una función a la que puede llamar si lo necesita.


Mi código se parece a esto,

params[''host_url''] = req.protocol + ''://'' + req.headers.host + req.url;


Necesitas construirlo usando req.headers.host + req.url . Por supuesto, si usted está alojando en un puerto diferente y así se le ocurre la idea ;-)


Usando url.format :

var url = require(''url'');

Esto soporta todos los protocolos e incluye número de puerto. Si no tiene una cadena de consulta en su originalUrl puede usar esta solución más limpia:

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

Si tienes una cadena de consulta:

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


Uso el paquete de nodo ''url'' (npm install url)

Lo que hace es cuando llamas.

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

le dará la posibilidad de recuperar todo o partes de la url. Más información aquí: https://github.com/defunctzombie/node-url

Lo usé de la siguiente manera para obtener lo que venga después de / en http://www.example.com/ para usarlo como variable y mostrar un perfil en particular (como 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);

Aunque para que esto funcione, debe crear su ruta de esta manera en su archivo server.js:

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

Y configura tu archivo de ruta de esta manera:

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


Utilizar esta,

var url = req.headers.host + ''/'' + req.url;


Yo sugeriría usar originalUrl en lugar de URL:

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

Consulte la descripción de originalUrl aquí: http://expressjs.com/api.html#req.originalUrl

En nuestro sistema, hacemos algo como esto, por lo que originalUrl es importante para nosotros:

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

blah_controller se ve así:

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

Así que nuestras URL tienen el formato:

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

Por lo tanto, necesitamos req.originalUrl en la barra del controlador get.


hacer req.host/req.hostname efectivo debe tener dos condiciones cuando Express detrás de los proxies :

  1. app.set(''trust proxy'', ''loopback''); en app.js
  2. X-Forwarded-Host encabezado X-Forwarded-Host debe ser especificado por usted en el servidor web. p.ej. 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>


var full_address = req.protocol + "://" + req.headers.host + req.originalUrl;

o

var full_address = req.protocol + "://" + req.headers.host + req.baseUrl;`