Aller au contenu

Introduction à Node.js - Serveur Web

Un Hello World dans un serveur web

Voici un petit exemple tout simple de serveur web qui affiche le message "Hello World". L'exemple est tiré de la documentation de Node.js.

serveur_hello.js
import { createServer } from 'node:http';

const hostname = '127.0.0.1';
const port = 3000;

const server = createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
  • Le module http de Node est inclus à la première ligne, c'est lui qui va être en charge du serveur
  • On définit ensuite une adresse d'hôte et un port pour notre serveur
  • On crée un objet serveur à la ligne 6. Dans la fonction de rappel les paramêtres représentent des objets associés à la requête http qui est reçu (req) et la réponse retournée (res).
  • Le statusCode est le code de statut retourné, ici 200 pour un succès
  • Le Content-Type défini le format de la réponse.
  • Avec la fonction end() on envoi le texte de la réponse.
  • La fonction listen à la ligne 12 lance le serveur et le met en mode "écoute"

Pour lancer le serveur

  • Lancer le programme avec la commande node serveur_hello.js dans un terminal.
  • Depuis un navigateur accédé à l'url http://localhost:3000/

L'url et ses paramètres

node_url.png

Comment extraire les parties d'un url

Deux modules à ajouter pour utiliser les commandes de l'image

import url from 'url';
import querystring from 'querystring';

On peut aussi simplifier l'acquisition des paramètres en ajoutant le paramètre true à la fonction url.parse(). Ça permet d'automatiquement convertir les paramètres de la requête en objet. Ça évite l'utilisation de querystring.

const params = url.parse(req.url, true).query;

La variable params est un tableau associatif avec le nom des paramètres en clé. Donc si je reçois le paramètre page=1, je peux y accèder avec comme ceci.

console.log(params["page"]);  // La valeur affiché sera 1

Exemple de serveur web avec gestion des paramètres

serveur_parametres.js
import { createServer } from 'node:http';
import url from 'url';

const hostname = 'localhost';
const port = 3000;

const server = createServer((req, res) => {
    // Récupération des paramètres
    const params = url.parse(req.url, true).query;
    const route = url.parse(req.url).pathname;

    // Affichage des valeurs de la requête
    console.log('Route : ' + route);
    console.log('Paramètres : ' + JSON.stringify(params));

    // Retourne les paramètres en JSON dans la réponse
    res.statusCode = 200;
    res.setHeader('Content-Type', 'application/json');
    res.write(JSON.stringify(params));

    res.end();
});

server.listen(port, hostname, () => {
    console.log(`Le serveur est lancé à l'adresse http://${hostname}:${port}/`);
});

Pour lancer le code, exécutez le fichier et entrez l'url http://localhost:3000/ dans un navigateur avec n'importe quel route et paramètres. Par exemple http://localhost:3000/test?param1=hello&param2=world. Le serveur va retourner les paramètres sous format JSON.

Autre exemple avec gestion des routes

serveur_route.js
import { createServer } from 'node:http';
import url from 'url';

const hostname = 'localhost';
const port = 3000;
const server = createServer((req, res) => {

    // Récupération de la route
    const route = url.parse(req.url).pathname;

    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain; charset=utf-8');

    if (route == '/') {
        res.write("Bienvenue au jeu d'évasion entrez dans la salle de regroupement.");
    } else if (route == '/salle-serveurs') {
        res.write('Vous êtes dans la salles des serveurs, bonne chance !');
    } else if (route == '/etage/1/prof') {
        res.write('Hé ho, que faîtes-vous dans mon bureau !?!?!');
    } else {
        res.write('Page introuvable !');
        res.statusCode = 404;
    }
    res.end();
});

server.listen(port, hostname, () => {
    console.log(`Le serveur est lancé à l'adresse http://${hostname}:${port}/`);
});

À la ligne 9 on récupère le nom de la route dans l'url. Ensuite avec une série de if..else on peut exécuté un traitement différent selon la route. Si la route est différente de ceux qu'on a codé, on retourne une erreur 404.