Mis à jour le mardi 2 janvier 2018
  • 10 heures
  • Difficile

Ce cours est visible gratuitement en ligne.

Ce cours existe en livre papier.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

Vous pouvez être accompagné et mentoré par un professeur particulier par visioconférence sur ce cours.

J'ai tout compris !

Node.js en production : les erreurs à éviter

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Ça y est ! Votre application tourne et votre serveur est prêt a recevoir du trafic. Mais…

Quoi ? Ça ne suffit pas ? :o

Loin de là ! Pour que vous compreniez pourquoi, je vais vous montrer comment Node.js gère ses erreurs.

Node.js et la gestion d'erreurs

Voyons ce que la documentation de Node.js a à nous dire :

Toutes les erreurs JavaScript sont gérées comme des exceptions qui créent et lancent (throw) une erreur via le mécanisme Javascript standard de throw. Ceux-ci sont gérés en utilisant la construction try/catch donnée par le langage JavaScript.

// Lance une ReferenceError car z n'est pas défini
try {
var m = 1;
var n = m + z;
} catch (err) {
// Gérer l'erreur ici
}

Dans la construction try/catch, une erreur est lancée dans le programme, et plus rien ne s’exécute jusqu’à ce que l'erreur soit gérée par un catch.

Mais alors si une erreur survient dans notre application et n’est pas gérée… Que se passe-t-il ?

Regardez ce que cela donne sur une application simple (ce code contient une erreur de débutant… trouvez-la ;)) :

var http = require('http');

var server = http.createServer(function(req, res) {
  res.writeHead(200);
  res.end('Salut tout le monde !');
  visiteurs++;
});

server.listen(8080); // Démarre le serveur
console.log("j'ecoute sur 8080");

Une fois le serveur lancé, rendez-vous sur localhost:8080 : un joli Salut tout le monde vous attend. Mais si vous rafraîchissez la page, vous allez vous rendre compte que le serveur ne marche plus... Que s'est-il passé ?

Regardons notre console :

$ node app.js 
j'ecoute sur 8080
/home/user/openclassrooms/example/app.js:6
 visiteurs++;
 ^

ReferenceError: visiteurs is not defined
 at Server.<anonymous> (/home/user/test/openclassrooms/example/app.js:6:3)
 at emitTwo (events.js:106:13)
 at Server.emit (events.js:191:7)
 at parserOnIncoming (_http_server.js:562:12)
 at HTTPParser.parserOnHeadersComplete (_http_common.js:99:23)

Et PAF ! Notre variable visiteurs n'est jamais définie, et l'application va planter. En Node.js, contrairement à PHP ou Ruby, si la moindre erreur survient et n'est pas gérée, l’application meurt. Et elle ne servira plus aucune requête avant d’être redémarrée !

Mais... facile ! Il me suffit de mettre un try/catch autour de tout mon code et l'application ne s’arrêtera plus jamais !

Hé non ! Cette méthode ne garantit pas l'état de votre application : il se peut qu'elle ait crashé pour une raison légitime et non seulement vous ne le saurez jamais, mais en plus les nouvelles requêtes seront mal servies !

La bonne pratique est de loguer l’erreur quelque part pour en avoir une trace, puis de redémarrer l’application. Cela permet de revoir les erreurs passées et de tenter de les reproduire, tout en assurant une bonne qualité de service.

Pour cela, plusieurs solutions existent. Dans la suite, je vais vous parler de PM2, un gestionnaire d'applications‌ open source écrit en Node.js‌.

Exemple de certificat de réussite
Exemple de certificat de réussite