362 votes

node.js Express next()

Donc, dans l’Express, vous avez un simple bloc de code comme ceci :

À la demande de « / », faire cette fonction du code envoi en objets req et res.

Certains autres blocs de code, semblent passer un argument 3e en étant next()

Tiré de la documentation de l’Express

Je ne comprends pas quel est l’intérêt de next() ou pourquoi y être utilisés. Dans cet exemple, si l’id n’existe pas, ce qui est ensuite en train de faire ?

298voto

Yuki Izumi Points 7493

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!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X