Pasa el control a la siguiente ruta coincidente. En el ejemplo que da, por ejemplo, puede buscar al usuario en la base de datos si se le dio un id
, y asignarlo al req.user
.
A continuación, puede tener una ruta como:
app.get('/users', function(req, res) {
// check for and maybe do something with req.user
});
Desde/usuarios/123 coincidirá con la ruta en su ejemplo en primer lugar, que primero comprobar y encontrar el usuario 123
; entonces /users
puede hacer algo con el resultado de eso.
Route middleware (nota: el enlace es a la documentación 2.x, pero esto se ha probado como trabajar en 3.x) es una herramienta más flexible y poderosa, aunque, en mi opinión, ya que no depende de un particular Esquema URI u orden de ruta. Me inclinaría a modelar el ejemplo que se muestra como este, asumiendo un modelo con un Users
asíncrono findOne()
:
function loadUser(req, res, next) {
if (req.params.userId) {
Users.findOne({ id: req.params.userId }, function(err, user) {
if (err) {
next(new Error("Couldn't find user: " + err));
return;
}
req.user = user;
next();
});
} else {
next();
}
}
// ...
app.get('/user/:userId', loadUser, function(req, res) {
// do something with req.user
});
app.get('/users/:userId?', loadUser, function(req, res) {
// if req.user was set, it's because userId was specified (and we found the user).
});
// Pretend there's a "loadItem()" which operates similarly, but with itemId.
app.get('/item/:itemId/addTo/:userId', loadItem, loadUser, function(req, res) {
req.user.items.append(req.item.name);
});
ser capaz de controlar el flujo de este tipo es bastante práctico. Es posible que desee tener ciertas páginas solamente disponible para los usuarios con una bandera de administración:
/**
* Only allows the page to be accessed if the user is an admin.
* Requires use of `loadUser` middleware.
*/
function requireAdmin(req, res, next) {
if (!req.user || !req.user.admin) {
next(new Error("Permission denied."));
return;
}
next();
}
app.get('/top/secret', loadUser, requireAdmin, function(req, res) {
res.send('blahblahblah');
});
espero que esto le dio un poco de inspiración!
Siguiente simplemente permite que el siguiente controlador de ruta en línea maneje la solicitud. En este caso, si la identificación del usuario existe, es probable que use 'res.send' para completar la solicitud. Si no existe, es probable que haya otro controlador que emita un error y luego complete la solicitud. –
, entonces dices que tengo 'app.post ('/ login', función (req, res))' después de 'app.get ('/ users', function (req, res))' se llamará login siendo la siguiente ruta en el archivo app.js al llamar a next()? – Menztrual
No, debe consultar esta parte de la documentación de Express.js: http://expressjs.com/guide.html#passing-route control –