javascript - online - ruta critica pert
cómo obtener la ruta de solicitud con el objeto de solicitud urgente (8)
req.route.path funciona para mí
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);
});
});
};
después de ejecutar veo lo siguiente en la consola y obtengo el resultado perfecto en mi navegador.
Express server listening on port 3000 in development mode
A call to route: /plants
Request type: get
Estoy usando express + node.js y tengo un objeto req, la solicitud en el navegador es / account pero cuando registro req.path obtengo ''/'' --- 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 es / ¿cuándo debería ser / account?
Debería ser:
req.url
express 3.1.x
Después de jugar un poco, deberías usar:
console.log(req.originalUrl)
En algunos casos debes usar:
req.path
Esto le proporciona la ruta, en lugar de la URL completa solicitada. Por ejemplo, si solo está interesado en qué página solicitó el usuario y no en todos los tipos de parámetros, la url:
/myurl.htm?allkinds&ofparameters=true
req.path te dará:
/myurl.html
Para la versión 4.x, ahora puede usar req.baseUrl
además de req.path
para obtener la ruta completa. Por ejemplo, el OP ahora haría algo como:
//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();
}
});
Si realmente desea obtener solo "ruta" sin querystring, puede usar la biblioteca de url
para analizar y obtener solo la parte de ruta de la url.
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();
}
});
//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 / account?
La razón para esto es que Express resta la ruta en la que está montada su función de controlador, que es ''/account''
en este caso.
¿Por qué hacen esto?
Porque hace que sea más fácil reutilizar la función del controlador. Puede hacer una función de controlador que hace cosas diferentes para req.path === ''/''
y req.path === ''/goodbye''
por ejemplo:
function sendGreeting(req, res, next) {
res.send(req.path == ''/goodbye'' ? ''Farewell!'' : ''Hello there!'')
}
Luego puede montarlo en múltiples puntos finales:
app.use(''/world'', sendGreeting)
app.use(''/aliens'', sendGreeting)
Dando:
/world ==> Hello there!
/world/goodbye ==> Farewell!
/aliens ==> Hello there!
/aliens/goodbye ==> Farewell!
res.redirect(req.header(''referrer''));
redirigirá a la dirección url actual.