Créer une application web avec Node.js

Asynchrone

Lorsque vous commencez à développer avec Node.js, il faut vous attendre à changer certaines habitudes. En effet, la vitesse est due dans un premier temps au fait que celui-ci soit asynchrone.

L'asynchrone qu'est-ce donc ? Et bien, cela consiste au déroulement de tâches de manières non itératives, non bloquante contrairement à du JavaScript coté client.

Pour illustrer ces propos, on peut prendre en référence le chargement d'une page web ou le chargement du DOM et des scripts (ne possédant pas l'attribut async) sont fait de manières synchrone.

(Ces images sont issues du site growingtheweb.com) Légende Chargement synchrone

Sur cette image, on se rend bien compte qu'il y a une "perte" de temps lors du chargement de la page car tout est exécuté tâche par tâche.

Une manière de penser différente

Vous l'aurez sans doute compris, l'asynchrone va poser quelques soucis dans le cas d'un développement JavaScript ordinaire. Pourquoi cela certains se poseront-ils, voici un exemple montrant de manière significative le problème :

// Récupération du contenu d'un fichier
var myFile = getSomeFile('a-path/file.json');

// Manipulation des données du fichier, ex JSON
var data = JSON.parse(myFile);

Si vous avez bien suivi, cela devrait vous sauter aux yeux. On souhaite récupérer le contenu d'un fichier pour ensuite le parser. Hors, comme il a été dis précédemment, Node.js exécute le code de manière asynchrone et n'attends pas qu'une fonction soit terminée pour continuer. Dans notre cas ici, le code lèvera une erreur indiquant que myFile is undefined.

L'avenement des callbacks

Ce mot callback doit vous être familié si vous êtes un utilisateur de librairies comme JQuery, Angular, Ember et de nombreuses autres qui utilisent énormément le principe des callbacks.

Qu'est ce qu'un callback ?
Comme son nom l'indique en anglais, callback est généralement une fonction anonyme appellée en retour d'une autre fonction.

Par exemple, avec JQuery et sa fonction $.get() ou vous passez en 1er argument le chemin et en second une fonction callback.

Cette fonction sera alors exécuté à la fin de la fonction, une fois que toutes les données ont été récupérées.

Exemple de la méthode get de JQuery :

$.get('/my-url', function(response) {
  // Nous avons accès aux données
  var data = JSON.parse(response);
});

C'est devenu un peu "la marque de fabrique" de Node.js, où en effet, les callback sont partout. Que ce soit pour lire un fichier, créer un serveur HTTP, etc... Les callback sont partout !

ATTENTION
Je tiens à vous prévenir, les callbacks sont loin d'être la solution à tout ! En effet, on entend souvent parler de callback hell ou traduit littéralement l'enfer des callback.

Il se peut que vous souhaitiez faire plusieurs requêtes l'un à la suite de l'autre, cela aurait pour effet de créer une espèce de pyramide comme ceci rendant le code très difficile à maintenir comme ici :

Callback hell

Assez consternant n'est-ce pas ? Pour palier à ce problème, il existe plusieurs solutions dont 2 principales :

  • Utiliser les promesses (Promise) via un module / librairie tierce
  • Séparer votre code en plusieurs fonctions / modules

Vous pourrez retrouver un chapitre sur les promesses en annexe de ce livre.