cómo obtener la ruta de solicitud con el objeto de solicitud expresa
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?
Después de jugar un poco, deberías usar:
console.log(req.originalUrl)
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;
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
Esto puede producir resultados diferentes cuando se llama directamente al módulo base, es decir, al archivo principal (por ejemplo, index.js
o 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 :
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;
Ahora importaremos este módulo de usuario en el módulo principal de la aplicación y lo agregaremos
/api/users
como ruta base para el módulo de usuario usandoapp.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 :
Definiremos nuestra ruta directamente en el módulo principal (es decir, app.js o index.js) y concatenaremos la ruta base
/app/users
con 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 baseUrl
es la cadena vacía aquí. Entonces, el originalUrl
también cambia y se ve igual que elurl