cómo obtener la ruta de solicitud con el objeto de solicitud expresa

Resuelto chovy asked hace 12 años • 11 respuestas

Estoy usando express + node.js y tengo un objeto req, la solicitud en el navegador es /cuenta pero cuando inicio sesión en req.path obtengo '/' --- no '/cuenta'.

  //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 es/cuándo debería ser/cuenta?

chovy avatar Sep 21 '12 14:09 chovy
Aceptado

Después de jugar un poco, deberías usar:

console.log(req.originalUrl)

Menztrual avatar Sep 21 '2012 08:09 Menztrual

Aquí hay un ejemplo ampliado de la documentación, que resume muy bien todo lo que necesita saber sobre cómo acceder a las rutas/URL en todos los casos con express:

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()
})

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

Conclusión: como dice la respuesta de c1moore , utilice:

var fullPath = req.baseUrl + req.path;
Ciabaros avatar May 30 '2019 15:05 Ciabaros

En algunos casos deberías utilizar:

req.path

Esto le proporciona la ruta, en lugar de la URL solicitada completa. Por ejemplo, si solo le interesa qué página solicitó el usuario y no todo tipo de parámetros, la URL:

/myurl.htm?allkinds&ofparameters=true

req.path le dará:

/myurl.html
DivZero avatar May 19 '2013 11:05 DivZero

Esto puede producir resultados diferentes cuando se llama directamente al módulo base, es decir, al archivo principal (por ejemplo, index.jso app.js) frente a cuando se llama desde el interior del módulo a través app.use()del middleware, es decir , al archivo de ruta (por ejemplo routes/users.js) .

Llamada API:
http://localhost:8000/api/users/profile/123/summary?view=grid&leng=en

Compararemos nuestros resultados con la llamada API anterior.


Primero, veremos el resultado del módulo interno :

  1. Colocaremos nuestro módulo de usuario dentro del directorio de rutas , con una ruta, es decir/profile/:id/:details

    archivo rutas/usuarios.js

    const router = (require('express')).Router();
    
    router.get('/profile/:id/:details', (req, res) => {
    
        console.log(req.protocol);        // http or https
        console.log(req.hostname);        // only hostname without port
        console.log(req.headers.host);    // hostname with port number (if any); same result with req.header('host')
        console.log(req.route.path);      // exact defined route
        console.log(req.baseUrl);         // base path or group prefix
        console.log(req.path);            // relative path except query params
        console.log(req.url);             // relative path with query|search params
        console.log(req.originalUrl);     // baseURL + url
    
        // Full URL
        console.log(`${req.protocol}://${req.header('host')}${req.originalUrl}`);
    
        res.sendStatus(200);
    
    });
    
    module.exports = router;
    
  2. Ahora importaremos este módulo de usuario en el módulo principal de la aplicación y lo agregaremos /api/userscomo ruta base para el módulo de usuario usando app.use()middleware.

    archivo index.js

    const app = (require('express'))();
    
    const users = require('./routes/users');
    app.use('/api/users', users);
    
    const server = require('http').createServer(app);
    server.listen(8000, () => console.log('server listening'));
    

Producción

[req.protocol] ............. http
[req.hostname] .......... localhost
[req.headers.host] ..... localhost:8000
[req.route. ruta] .......... /profile/:id/:details
[solicitud.baseUrl] ................ /api/users
[ruta.solicitud] ................ ..... /profile/123/summary
[solicitud.url] ...................... /profile/123/summary?view=grid&leng=en
[solicitud.url original] ........../api/users/profile/123/summary?view=grid&leng=en

URL completa:
http://localhost:8000/api/users/profile/123/summary?view=grid&leng=en


Ahora veremos el resultado si agregamos rutas directamente en el módulo principal :

  1. Definiremos nuestra ruta directamente en el módulo principal (es decir, app.js o index.js) y concatenaremos la ruta base /app/userscon la ruta de la ruta en lugar de usar middleware. Entonces la ruta se convertirá/api/users/profile/:id/:details

    archivo index.js

    const app = (require('express'))();
    
    app.get('/api/users/profile/:id/:details', (req, res) => {
    
        console.log(req.protocol);        // http or https
        console.log(req.hostname);        // only hostname without port
        console.log(req.headers.host);    // hostname with port number (if any); same result with req.header('host')
        console.log(req.route.path);      // exact defined route
        console.log(req.baseUrl);         // base path or group prefix
        console.log(req.path);            // relative path except query params
        console.log(req.url);             // relative path with query|search params
        console.log(req.originalUrl);     // baseURL + url
    
        // Full URL
        console.log(`${req.protocol}://${req.header('host')}${req.originalUrl}`);
    
        res.sendStatus(200);
    
    });
    
    const server = require('http').createServer(app);
    server.listen(8000, () => console.log('server listening'));
    

Producción

[req.protocol] ............. http
[req.hostname] .......... localhost
[req.headers.host] ..... localhost:8000
[req.route. ruta] .......... /api/users/profile/:id/:details
[solicitud.baseUrl] ................
[ruta.solicitud] ................ ..... /api/users/profile/123/summary
[solicitud.url] ...................... /api/users/profile/123/summary?view=grid&leng=en
[solicitud.url original] ........../api/users/profile/123/summary?view=grid&leng=en

URL completa:
http://localhost:8000/api/users/profile/123/summary?view=grid&leng=en

Podemos ver claramente en el resultado anterior que la única diferencia es cuál baseUrles la cadena vacía aquí. Entonces, el originalUrltambién cambia y se ve igual que elurl

TalESid avatar Oct 20 '2021 14:10 TalESid