64 votes

Avoir un moment difficile essayer de comprendre "suivant/next ()" dans express.js

Ceci est un exemple de cela:

// Configuration
app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

(etc.)

app.get('/memo', function(req, res) {
  console.log("index");
  Memo.find({}, function(err, data) {
    if(err) return next(err);
    res.render('index', { memos: data });
  });
});

Et en voici une autre:

app.get('/memo/list', function(req, res, next) {
  console.log("get memos");
  Memo.find({}, function(err, data) {
    if(err) return next(err);
    res.json(data);
  });
});

Prises à partir d'un simple bloc-notes construit sur le nœud

Telles sont les questions qui sont curieuses de moi:

  1. Quel est exactement next/next(); ? Qu'arriverait-il si elle n'est pas présente?
  2. Pourquoi la deuxième partie prenant next comme paramètre, et la première n'est-ce pas?

EDIT:

93voto

alessioalex Points 27001

Express utilise middleware fonctions callbacks (fonctions quand une action est terminée), et ensuite a cet effet (c'est un rappel qui déclenche la prochaine middleware dans l'Express de la pile). Tous Expriment middleware (c'est-à Connecter compatible) ont 3 params: requête, réponse, la prochaine (qui est facultatif).

Par exemple, la statique middlware sert des fichiers statiques, les csrf middleware recherche un param lors de la réception des requêtes POST et le routeur middleware qui gère les routes (ce que vous avez collé ci-dessus en est un).

Chaque middleware peut compléter la tâche et appeler l' next middleware dans la file d'attente si certaines conditions sont remplies (par exemple la statique middleware de ne pas appeler un prochain middleware, parce qu'il prendra soin sur elle-même pour servir les fichiers, de sorte que le routeur ne sera pas obtenir de l'appelé).

Dans le routeur vous n'avez pas l'habitude de les appeler next car il a tendance à être le dernier middleware exécutée (sauf si vous voulez quelque chose comme le benchmarking).

Si vous souhaitez créer un middleware qui refuse l'accès à tous les utilisateurs qui ne sont pas connectés, vous appelez next() seulement si l'utilisateur est connecté (de sorte que la prochaine middleware est appelé, le routeur dans ce cas, et l'utilisateur peut accéder à la page qu'il cherche), sinon vous auriez probablement rediriger lui à la page de connexion.

next prend pas de paramètres, ou une erreur en tant que paramètre.

Edit: en fonction de votre configuration, le routeur est à l'avant de la statique, de middleware, donc si vous voulez des fichiers pour être servi, il faut déclarer un générique route qui appelle next() lorsque la route n'est pas en correspondance:

app.get('*', function (req, res, next) {
  // no route is matched
  // so call next() to pass to the static middleware
  next();
});

Note: je ne vous recommande pas de mettre le fichier statique du serveur une fois que le routeur, je vous suggère de le mettre avant de sorte que vous pouvez définir votre propre 404 personnalisée routes.

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