Node.js : les modules

Un module Node.js est en quelque sorte une sorte de bibliothèque regroupant un ensemble de fonctions pour des tâches bien précises. Node.js contient déjà des modules intégrés que vous pouvez utiliser directement dans vos applications comme le module http, fs, zlib, etc ...

Comment utiliser un module ?

Un module s'utilise simplement en l'incluant dans le fichier qui veut l'utiliser.

Cas du module http

Par exemple, pour utiliser le module http qui permet de mettre en place un serveur, il faut faire : 

const http = require('http');

Vous pouvez choisir n'importe quelle variable qui va contenir le module. Intuitivement et c'est ce qui se fait généralement, j'ai choisi http. Après avoir inclus le module http, nous pouvons maintenant avoir accès à ses méthodes.
Pour créer un serveur, on a alors la méthode createServer. Elle prend deux paramètres à savoir la requête (demande d'une page par exemple) et la réponse du serveur. Elle renvoie une instance de la class http.Server. Et pour que le serveur fonctionne normalement, il faut l'écouter sur un port. On le fait avec la méthode listen de la class http.Server : 

const http = require('http');

http.createServer((req, res) => {

}).listen(8080);

On pourrait très bien le décomposer ainsi pour qu'on le comprenne mieux : 

const http = require('http');

const server = http.createServer((req, res) => {

});
server.listen(8080);

req représente la requête et res la réponse du serveur. Le code dans son état fera tourner le serveur sans s'arrêter. Il faudra spécifier qu'on a fini de traiter la requête et envoyer une réponse. Et ça tombe bien, on a des méthodes qu'on peut utiliser sur la réponse. On peut par exemple renseigner le statuscode et le type de contenu mais aussi envoyer un message à afficher.

const http = require('http');

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
    res.end('Hello');
}).listen(8080);

La méthode writeHead permet de renseigner les différentes informations à envoyer en entête de la réponse à savoir le statuscode (ici 200) pour savoir si tout s'est passé ou pas, un objet pour des informations précises d'entête comme le type de contenu, la taille du contenu et autres. La méthode end permet de dire que c'est terminé et vous pouvez envoyer du contenu en terminant comme 'Hello' dans notre cas.

Il faut aussi préciser que vous pouvez écrire dans la réponse de plusieurs manières. Par exemple, vous pouvez utiliser la méthode write : 

const http = require('http');

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
    res.write('Hello');
    res.end();
}).listen(8080);

Enregistrez le code dans un fichier nommé par exemple server.js dans un dossier de votre disque. Dans votre invite de commande ou terminal, déplacez-vous dans le dossier du fichier et exécutez le fichier en tapant node server.js Normalement, rien ne sera affiché mais dans votre navigateur, tapez l'adresse http://localhost:8080 (supposant que vous êtes en local). Vous verrez à l'écran 'Hello'.

Voyons aussi rapidement ce qu'on peut avec le paramètre req qui représente la requête du client. On peut récupérer la partie après le nom de domaine dans l'url avec la propriété url de l'objet req.

considérons que nous avons tapé l'url http://localhost:8080/parameters.

const http = require('http');

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
    res.write(req.url);
    res.end();
}).listen(8080);

Le code ci-dessous va retourner /parameters (notre domaine ici est http://localhost:8080).

Vous avez toute la documentation sur http ici et c'est très complet.

Cas du module url

Vous pouvez aussi récupérer les valeurs des paramètres passés dans l'url avec l'utilisation du module url à ne pas confondre avec la propriété url de l'objet requête du client. Comme vous le savez, pour utiliser un module, il faut l'inclure : 

Imaginons que notre adresse url est : http://localhost:8080/?nom=john&prenom=doe

const http = require('http');
const url = require('url');

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
    let p = url.parse(req.url, true).query;
    let params = p.nom + " " + p.prenom;
    res.write(params);
    res.end();
}).listen(8080);

La méthode parse() du module url parmet d'analyser une chaine url fournie en paramètre (dans notre cas la partie après le domaine) et retourne un objet grace au paramètre true. Nous pouvons maintenant accéder à cet objet plus facilement via la propriété query.

Notre script va afficher john doe.
NB : à chaque modification du fichier, il faut couper le serveur (ctrl+c) et le relancer en tapant node server.js.

Vous avez toute la documentation sur url ici.

Cas du module file

Maintenant, nous voulons plutôt afficher comme réponse le contenu d'un fichier html ce qui suppose que nous devons le lire. Pour cela, nous allons utiliser le module fs donc l'inclure.

Créons d'abord notre fichier html avec ce contenu. On va le mettre au même niveau que notre fichier js et on va le nommer index.html : 

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Mon site</title>
</head>
<body>
    <h1>Welcome</h1>
    <p>je suis sur la page d'accueil</p>
</body>
</html>

Maintenant, notre fichier js peut ressembler à ceci : 

const http = require('http');
const fs = require('fs');

http.createServer((req, res) => {
    fs.readFile('index.html', (err, data) => {
        if(err) throw err;
        res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
        res.write(data);
        res.end();
    });
}).listen(8080);

Le script est assez simple à comprendre. Au moment d'une requête client, on demande à lire un fichier avec la méthode readFile du module fs. Cette méthode prend en paramètres le chemin du fichier à lire, une fonction de callback qui elle même prend en paramètres l'état du traitement (err) c'est-à-dire s'il y'a eu erreur ou pas et le contenu du fichier (data). Cette ligne if(err) throw err; veut simplement dire que s'il y'a eu une erreur alors on lève l'exception. Vous pouvez bien entendu traiter plus efficacement cette partie en renvoyant différents messages ou heders en fonction du fait qu'il y'a eu erreur ou pas.
En relançant le serveur, vous devez voir le contenu du fichier HTML.

Toute la documentation sur le module fs est ici.

Il existe un nombre important de modules que nous pouvons pas énumérer ici mais vous avez une idée de comment les utiliser et la documentation est très bien faite pour se retrouver facilement.
Nous allons voir un dernier cas qui est la création de nos propres modules.

Cas du module personnalisé

Vous pouvez créer vos propres modules et les inclure comme tout module natif. Ecrivons un simple module dans un fichier nommé mymodule.js avec ce code : 

let mytext = function(){
    return 'je suis un texte personnalisé dans un module personnalisé';
};
exports.mytext = mytext;

Le mot clé exports permet d'exporter votre module donc de l'inclure ailleurs pour l'utiliser. Nous avons donner le même nom à notre module que la variable. On pouvait donner un autre nom sans problème.

Dans notre fichier server.js, on va l'inclure et l'utiliser : 

const http = require('http');
const mm = require('./mymodule');

http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type' : 'text/html; charset=utf-8'});
    res.write(mm.mytext());
    res.end();
}).listen(8080);

Pour inclure notre module, vous avez remarqué qu'on a mis ./ au début pour signifier qu'on est dans le même dossier. C'est impératif de mettre cela sinon ça marchera pas. Nous avons mis notre module dans une variable nommée mm et ensuite sur cette variable on a appelé notre fonction mytext() qui se trouve dans notre fichier module. C'est aussi simple que cela.
En relaçant le server, on verra bien afficher je suis un texte personnalisé dans un module personnalisé.

Vous avez la documentation sur les modules ici.

Partager :
comments powered by Disqus

Suivez-moi sur Twitter

Copyright © 2010-2019 Lookman Design, tous droits réservés .