• 10 hours
  • Hard

Free online content available in this course.

Paperback available in this course

course.header.alt.is_certifying

You can get support and mentoring from a private teacher via videoconference on this course.

Got it!

Last updated on 12/18/18

Node.js en production : les erreurs à éviter

Log in or subscribe for free to enjoy all this course has to offer!

Ç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‌.

Example of certificate of achievement
Example of certificate of achievement