Getting started with Node.js : Part 2

Après un premier article d’introduction et avant de passer à un premier Hello world (passage obligatoire avant des choses plus intéressantes), nous allons revenir sur le fonctionnement de Node.

Everything runs in parallel, except your code !

Node.js est “single threaded”, il ne garde donc qu’un seul thread pour votre code ! C’est à dire que faire un “sleep” va bloquer votre serveur et, pendant ce temps là, il ne servira de nouvelles requêtes. Pour des actions très consommatrices de CPU, il peut donc y avoir des blocages (ce n’est pas magique non plus!).

Mais, toutes les actions IO sont lancées de manière asynchrone. Donc si l’une de vos actions (par exemple une lecture en base) est bloquante ou prend beaucoup de temps (les actions IO prennent généralement beaucoup de temps par rapport à votre code), alors votre serveur est toujours capable de servir d’autres requêtes. Get it ?

Call me back

La programmation asynchrone avec événement est intimement liée à la notion de callback et est souvent utilisée en Javascript. On retrouve aussi ce principe dans GWT (normal puisque votre Java se retrouvera au final en … Javascript).

En utilisant des callbacks, vous avez la garantie que votre code n’est pas interrompu et que ce callback soit exécuté une fois l’action terminée. Il n’est pas si simple de travailler de cette façon, pas forcément naturelle dans la plupart des langages.

Il est temps maintenant de faire un premier serveur. Tout d’abord vous devez installer Node.js. Comme la procédure varie selon votre OS, je vous renvoie vers l’excellent site howtonode, qui contient un ensemble de ressource pour Node.js dont une très bonne procédure d’installation.

Maintenant, commençons à coder une première application web. Pour cela nous allons avoir besoin :
– d’un serveur HTTP pour servir les pages web,
– d’un routeur pour répondre aux différentes requêtes selon l’URL,
– de différents handlers de requêtes,
– écrire également les différentes pages html pour les handlers afin de renvoyer le contenu au navigateur.

Si vous prenez votre langage favori, certaines de ces tâches ne sont pas nécessaires (votre Tomcat ou Apache HTTP s’en occupe pour vous). Avec Node.js les choses sont un peu différentes, il nous faut tout écrire, notamment le serveur HTTP… Mais vous allez voir, c’est simple et rapide ! Et pour cette première introduction, nous allons nous contenter du serveur.

Mon premier serveur HTTP

Créez un fichier server.js et collez le code suivant :

var http = require("http");
http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Node is hype!");
  response.end();
}).listen(9000);

Et voila votre premier serveur ! Le code est assez explicite : il crée un serveur en local sur le port 9000 qui renvoie une page contenant “Node is hype”. Pour tester, lancer la commande “node server.js” et ouvrez votre navigateur (si vous avez suivi, vous connaissez l’URL).

Le module http est utilisé dans le code. Vous en utiliserez beaucoup dans vos développements, c’est l’une des forces de Node.js : beaucoup de modules existent et font probablement déjà ce que vous voulez faire.

L’autre point intéressant est l’argument passé en paramètre de la fonction createServer(). C’est une fonction ! Pour les habitués de Javascript (ou des langages fonctionnels) rien d’étonnant. Pour les purs Javaistes cela peut surprendre… La fonction passée est une fonction anonyme, elle n’est pas nommée dans le code. On pourrait écrire le même code différemment :

function requestHandler(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Node is hype!");
  response.end();
}
http.createServer(requestHandler).listen(8888);

En fait cette fonction est notre handler de requête et votre premier callback. En effet à l’arrivée de chaque requête, c’est cette fonction qui sera appelée (c’est la partie event-driven/callback de Node.js). Vous voyez donc peut-être comment résoudre le problème des fonctions qui prennent beaucoup de temps et risquent de bloquer votre serveur au début : il suffit d’en faire des callbacks pour que Node.js continue à servir les autres requêtes.

Organiser son code

Vous vous interrogez peut être sur l’organisation du code. Généralement les tutoriaux vous permette de garder toute la logique dans un seul fichier source. Pour une vraie application, même légère, on se retrouve rapidement à vouloir séparer le code. Cela peut se faire assez simplement avec des modules, que vous pouvez utiliser dans votre code. Vous avez vu le module “http”, il est temps de faire votre propre module “server” qui démarrera le … serveur.
Pour cela il suffit de “wrapper” le code existant dans une fonction et d’exporter cette fonction.

var http = require("http");
function start(){
  http.createServer(function(request, response) {
    response.writeHead(200, {"Content-Type": "text/plain"});
    response.write("Node is hype!");
    response.end();
  }).listen(9000);
}
exports.start = start;

Vous pouvez alors faire un autre fichier main.js ou vous utilisez ce module.

var server = require("./server");
server.start();

Simple n’est-ce pas ?
Maintenant que nous savons faire un module et un serveur de base, nous allons pouvoir nous attaquer le plat de résistance. Stay tuned!

À propos de Cédric Exbrayat

Cédric Exbrayat, développeur et fondateur Ninja Squad, se réunit avec ses semblables régulièrement que ce soit au Lyon JUG ou à Mix-it, dont il est le fondateur. Java et JS for food and fun.

Publié le 31/07/2011, dans Getting started, et tagué , . Bookmarquez ce permalien. 8 Commentaires.

  1. Très intéressant, vivement la suite?
    Tu vas nous montrer un peu comment utiliser express?

  2. Yes, je pense continuer avec un proto réalisé que je vais simplifier (rien de très compliqué, mais utilisation de différents modules, tests etc…). Tu le sais mieux que moi, mais ce genre d’article prend du temps 😛

  3. La suite est toute aussi réussie que la première partie, du bon boulot !

  4. samkiller K

    Interessant. C’est quoi la suite? express, socketstream?

  1. Pingback: Getting Started with Hadoop : Part 1 « Hype Driven Development

  2. Pingback: Un an de hype! « Hype Driven Development

  3. Pingback: JUGSummerCamp 2012 « Hype Driven Development

Laisser un commentaire