Il passe le contrôle à la prochaine correspondance de route. Dans l'exemple que vous donnez, par exemple, vous pouvez rechercher l'utilisateur dans la base de données si l' id
a été donné, et l'attribuer req.user
.
Ci-dessous, vous pourriez avoir une route comme:
app.get('/users', function(req, res) {
// check for and maybe do something with req.user
});
Depuis /utilisateurs/123 correspondre à la route dans votre exemple de la première, qui sera d'abord rechercher et de trouver de l'utilisateur 123
; ensuite, /users
peut faire quelque chose avec le résultat.
Itinéraire middleware (note: le lien est à 2.x de la documentation, mais ce n'est testé que le travail sur 3.x) est un plus outil souple et puissant, si, à mon avis, car il ne repose pas sur un schéma d'URI ou de l'itinéraire de la commande. Je serais enclin à le modèle de l'exemple présenté comme ceci, en supposant un Users
modèle avec un async findOne()
:
function loadUser(req, res, next) {
if (req.params.userId) {
Users.findOne({ id: req.params.userId }, function(err, user) {
if (err) {
return next(new Error("Couldn't find user: " + err));
}
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);
});
Le pouvoir de contrôle de débit comme c'est assez pratique. Vous pourriez avoir certaines pages ne seront disponible que pour les utilisateurs avec un admin drapeau:
/**
* 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) {
return next(new Error("Permission denied."));
}
next();
}
app.get('/top/secret', loadUser, requireAdmin, function(req, res) {
res.send('blahblahblah');
});
Espérons que cela vous a donné de l'inspiration!