Node.js - 5.4.2 Comprendre le fonctionnement des middleware

Une requête traverse les middleware de haut en bas, un par un, jusqu'à ce qu'une réponse soit envoyée. Cette leçon précise la règle à retenir : appeler next() pour continuer, ou envoyer une réponse pour terminer le traitement.

Le parcours d'une requête

Express exécute les middleware de haut en bas, dans l'ordre du fichier. Pour que la requête atteigne le middleware suivant, le middleware en cours doit appeler next(). Sans cet appel, la requête s'arrête à cet endroit.

Express n'envoie pas de réponse par défaut. C'est donc à l'un des middleware d'en envoyer une.

Envoyer une réponse avec send()

Dans un middleware qui termine le traitement, on envoie une réponse avec res.send(). La méthode accepte du texte HTML, et Express définit automatiquement le type de contenu sur HTML. Dans ce cas, on n'appelle pas next(), car il n'y a plus rien à faire après la réponse.

app.use((req, res, next) => {
  res.send("<h1>Bonjour d'Express</h1>");
});

En résumé

Les middleware s'exécutent de haut en bas. next() passe la requête au suivant, et res.send() termine le traitement avec une réponse. Un middleware qui envoie une réponse ne doit pas appeler next().

Points clés

  • Les middleware sont exécutés dans l'ordre où ils sont déclarés.
  • next() est nécessaire pour atteindre le middleware suivant.
  • res.send() envoie une réponse et termine le traitement de la requête.
  • Pour un texte HTML envoyé avec send(), Express définit le type de contenu automatiquement.
  • Il ne faut pas envoyer deux réponses pour une même requête.

Questions fréquentes

Que se passe-t-il si aucun middleware n'envoie de réponse ?

La requête reste sans réponse et le navigateur attend. Il faut donc toujours envoyer une réponse à la fin du parcours.

Peut-on appeler next() après res.send() ?

Ce n'est pas conseillé. Après une réponse, il ne faut plus exécuter de code lié à la réponse, sinon une erreur apparaît.

Faut-il définir le type de contenu soi-même ?

Non, pour un texte HTML envoyé avec send(). Vous pouvez toujours le modifier avec un en-tête si besoin.