Maitriser le Nodejs de
débutant à avance
Prépare par : Zamor Herwens
C’est quoi [Link] ?
[Link] est une plateforme d'exécution JavaScript construite sur le moteur V8 de Google Chrome. Elle permet
d’exécuter du code JavaScript côté serveur (et non seulement dans un navigateur). [Link] transforme JavaScript,
initialement conçu pour les pages web interactives, en un langage capable de gérer des applications serveur
performantes.
[Link] a été créé en 2009 par Ryan Dahl. Son objectif principal était de développer une alternative aux
systèmes web traditionnels qui utilisaient un modèle de "thread" bloquant pour chaque requête. Ryan Dahl a construit
[Link] en utilisant le moteur V8 de Google, qui est rapide et optimisé pour le traitement JavaScript.
Pourquoi utiliser [Link] ?
[Link] est très populaire grâce à ses fonctionnalités uniques. Voici quelques raisons pour lesquelles vous devriez
envisager de l'utiliser :
1- Performance élevée
[Link] est basé sur un modèle non-bloquant et asynchrone, ce qui le rend très rapide pour traiter un grand
nombre de connexions simultanées.
Il repose sur le moteur V8 de Chrome, qui compile JavaScript en code machine très rapidement.
2- Une seule langue pour le frontend et le backend
Avec [Link], vous pouvez utiliser JavaScript à la fois côté serveur (backend) et côté client (frontend), ce qui
simplifie le développement et réduit la barrière d’apprentissage.
3- Grande communauté et écosystème riche
[Link] dispose de npm (Node Package Manager), qui contient des millions de bibliothèques prêtes à être
utilisées.
4- Idéal pour des applications en temps réel
[Link] est parfait pour des applications comme les chats, les jeux en ligne, ou les outils collaboratifs, grâce
à sa capacité à gérer des connexions simultanées.
5- Scalabilité
Le modèle basé sur un seul thread (event loop) permet une grande scalabilité.
6- Open Source
[Link] est entièrement open-source, ce qui signifie qu'il est gratuit et que tout le monde peut y contribuer.
Une application [Link] s’exécute en un seul processus, sans créer de fil de discussion pour chaque requête.
[Link] fournit un ensemble de primitives d’E/S asynchrones dans sa bibliothèque standard qui empêchent le code
JavaScript de se bloquer et, généralement, les bibliothèques dans [Link] sont écrites à l’aide de paradigmes non
bloquants, faisant du comportement de blocage l’exception plutôt que la norme.
Lorsque [Link] effectue une opération d’E/S, comme la lecture à partir du réseau, l’accès à une base de
données ou au système de fichiers, au lieu de bloquer le thread et de perdre des cycles CPU à attendre, [Link]
reprends les opérations lorsque la réponse revient.
Cela [Link] permet de gérer des milliers de connexions simultanées avec un seul serveur sans avoir à gérer la
simultanéité des threads, ce qui pourrait être une source importante de bogues.
Pourquoi apprendre [Link] ?
1- Grande demande sur le marché du travail
[Link] est très utilisé dans les entreprises modernes pour construire des applications rapides et évolutives,
ce qui en fait une compétence très recherchée.
Plus de 6.3 million de site utilise [Link].
Utiliser par des grosses entreprises comme Uber, Netfix, Linkedin, Paypal.
2- Facilité d'intégration avec d'autres outils
Vous pouvez facilement intégrer [Link] avec des bases de données modernes comme MongoDB ou des
frameworks comme [Link].
3- Idéal pour les développeurs JavaScript
Si vous connaissez déjà JavaScript, apprendre [Link] est une progression naturelle.
4- Support d'une grande communauté
Il existe de nombreuses ressources, tutoriels, et forums où vous pouvez trouver de l’aide.
Voici comment PHP ou ASP gère une demande de fichier :
1- Envoie la tâche au système de fichiers de l’ordinateur.
2- Attend que le système de fichiers s’ouvre et lise la commande lime.
3- Renvoie le contenu au client.
4- Prêt à affronter la prochaine demande.
Voici comment [Link] traite une demande de fichier :
1- Envoie la tâche au système de fichiers de l’ordinateur.
2- Prêt à traiter la prochaine demande.
3- Lorsque le système de fichiers a ouvert et lu le fichier, le serveur renvoie le contenu au client.
[Link] élimine l’attente et continue simplement avec la demande suivante.
[Link] exécute une programmation asynchrone monothread, non bloquante, qui est très économe en mémoire.
[Link] présente un avantage unique car des millions de développeurs frontend qui écrivent JavaScript pour le
navigateur sont désormais capables d’écrire le code côté serveur en plus du code côté client sans avoir besoin
d’apprendre un langage complètement différent.
[Link] est une plateforme puissante, idéale pour les applications modernes et performantes. Ce n'est pas
difficile à apprendre, surtout si vous connaissez déjà JavaScript, et il offre des opportunités passionnantes pour les
développeurs web. Si vous aimez créer des applications rapides et évolutives, [Link] est un excellent choix !
Que [Link] faire ?
1- [Link] pouvez générer du contenu de page dynamique
2- [Link] pouvez créer, ouvrir, lire, écrire, supprimer et fermer des fichiers sur le serveur
3- [Link] pouvez collecter les données du formulaire
4- [Link] pouvez ajouter, supprimer, modifier des données dans votre base de données
[Link] est-il difficile à apprendre ?
Cela dépend de votre niveau actuel et de vos connaissances en programmation :
1- Facile si vous connaissez déjà JavaScript
Si vous êtes familier avec JavaScript, [Link] sera relativement facile à apprendre car il s'agit simplement
d'utiliser JavaScript dans un contexte différent (côté serveur).
2- Quelques concepts spécifiques à comprendre
Les concepts comme la programmation asynchrone, l’event loop, et le modèle non-bloquant peuvent être
un peu complexes au début. Mais avec des exemples et de la pratique, ils deviennent intuitifs.
3- Richesse de la documentation
[Link] dispose d'une documentation officielle très détaillée et de nombreux tutoriels gratuits.
4- Progression progressive
Vous pouvez commencer par des projets simples (serveur HTTP, API REST) et passer à des projets plus
complexes (applications en temps réel, outils CLI).
Voici un exemple simple de serveur avec [Link] :
Si vous ne comprend rien, ne vous inquiétez pas. On va expliquer de manier détailler chaque parti du code.
Débuter avec [Link]
Pour travailler avec [Link], il faut quelques outils et configurations de base pour écrire, exécuter et tester vos
applications. Voici une liste des éléments essentiels :
1. la première étape pour commencer est de télécharger [Link] . [Link] inclut également npm (Node Package
Manager), qui est crucial pour gérer les bibliothèques et dépendances. Site
officiel : « [Link] »
1- Télécharger et installer : Allez sur le site officiel [Link] et téléchargez la version LTS (Long Term Support) pour
plus de stabilité.
2- Vérifier l'installation : Une fois installé, ouvrez un terminal et tapez :
node -v (# Vérifie la version de [Link])
npm -v (# Vérifie la version de npm)
2. Un éditeur de texte ou IDE, vous aurez besoin d’un bon éditeur pour écrire et gérer votre code. Je vous Recommande :
Visual Studio Code (VS Code). Il est léger, puissant et largement utilisé. Il a aussi des extensions utiles pour [Link], pour
faciliter votre travail de développement. Site officiel « [Link] »
3. Postman ou des outils similaires sont très utiles (et souvent indispensables) pour tester les API lorsque vous travaillez
avec [Link]. Site officiel [Link]
Commençons sans plus tarder à code avec [Link]
L’exemple le plus courant de ‘Bonjour le monde’ (Hello World) de [Link] est un serveur web :
Pour exécuter cet extrait, enregistrez-le en tant que fichier et exécutez-le dans votre terminal (ex : [Link]).
Taper: C:\Users\Your Name>node [Link]
Explications détaillées :
1. const http = require('http');
Cette ligne importe le module http natif de [Link].
Le module http permet de créer des serveurs HTTP ou de faire des requêtes HTTP.
Ici, nous utilisons ce module pour construire un serveur web.
2. const server = [Link]((req, res) => { ... });
[Link]() :
Cette méthode crée un serveur HTTP.
Elle prend une fonction de rappel (callback) qui sera exécutée à chaque requête reçue par le serveur.
Cette fonction reçoit deux arguments :
1. req (request) : Un objet contenant les informations de la requête (URL, headers, méthode, etc.).
2. res (response) : Un objet utilisé pour envoyer une réponse au client.
Callback (req, res) => { ... } :
C'est ici que nous définissons comment le serveur doit répondre aux requêtes des clients.
3. [Link](200, { 'Content-Type': 'text/plain' });
[Link]() :
Cette méthode définit le code de statut HTTP et les en-têtes (headers) de la réponse.
Elle prend deux arguments :
1. Code de statut : Ici, 200 signifie "OK", indiquant que la requête a été traitée avec succès.
2. En-têtes de réponse : Un objet contenant des informations sur le type de contenu envoyé.
'Content-Type': 'text/plain' :
Spécifie que le contenu de la réponse est du texte brut (plain text).
4. [Link]('Bonjour, monde avec [Link]!');
[Link]() :
Cette méthode termine la réponse et envoie les données au client.
Elle prend un argument facultatif (ici, 'Bonjour, monde avec [Link]!'), qui est le contenu à envoyer au
client.
Après l'exécution de cette ligne, la réponse est considérée comme complète, et aucune autre donnée ne
peut être envoyée pour cette requête.
5. [Link](3000, () => { ... });
[Link]() :
Cette méthode démarre le serveur et le fait écouter sur un port spécifique.
Ici, le serveur écoute sur le port 3000.
Callback () => { ... } :
Ce callback s'exécute lorsque le serveur est prêt et commence à écouter les requêtes.
Dans cet exemple, nous affichons un message dans la console pour indiquer que le serveur est
opérationnel.
6. [Link]('Serveur en écoute sur [Link]
Cette ligne affiche un message dans la console, informant que le serveur est actif et que vous pouvez y accéder
via l'URL [Link]
localhost :
Indique que le serveur est en cours d’exécution sur la machine locale.
Port 3000 :
Un numéro utilisé pour identifier l'application qui écoute.
Débuter en NodeJs
Lorsqu’on débute avec un nouveau projet [Link] on droit créer un fichier nommé ‘[Link]’. on va utiliser
la commande npm : npm init , Cela crée un fichier [Link]. ou ‘npm init –y’ pour sauter les questions.
Voici comment ressemble ce fameux fichier [Link] :
Créer le fichier principal
Dans le répertoire du projet, créez un fichier nommé [Link]. Ce fichier sera le point d’entrée de votre
application. Ajoutez le code suivant pour tester si tout fonctionne correctement :
[Link]('Hello world!');
Exécutez le fichier avec la commande :
node [Link]
Vous devriez voir le message ‘Hello world!’ dans la console.
Modules et Packages : Explication
Module : C’est un fichier ou une bibliothèque JavaScript qui exporte une fonctionnalité (fonction, classe, etc.) pour être
utilisée dans d'autres fichiers. Par exemple, dans [Link].
Package : Un ensemble de modules regroupés dans un dossier, souvent géré avec npm. Exemple : Express, qui simplifie
la création de serveurs web.
Vous pouvez créer un module comme ceci :
// [Link]
function sayHello(name) {
return `Hello, ${name}!`;
[Link] = sayHello;
Et l'importer dans un autre fichier :
const sayHello = require('./utils');
[Link](sayHello('John')); // Hello, John!
Ici, nous utilisons CommonJS, un format classique pour les modules [Link]. Cependant, les modules ES6 sont
aujourd'hui plus couramment utilisés. La principale différence réside dans le mode d'importation et d'exportation.
Pour utiliser les modules ES6 dans votre projet, vous devez configurer votre application pour les prendre en
charge. Rendez-vous dans le fichier [Link] et ajoutez cette ligne : "type": "module"
Voici un exemple de module avec ES6 Modules :
// [Link]
export const randomNumber= () => {
return [Link]([Link]() * 1000) + 10;
};
Et l'importer dans un autre fichier :
import {randomNumber} from "./[Link]";
[Link](randomNumber());
Remarque importante :
Ne pas oublier le suffixe ‘.js’ à la fin de l'importation en utilisant ES6 Modules. Contrairement à
CommonJS, où vous pouvez omettre l'extension, les modules ES6 exigent qu'elle soit explicitement
ajoutée, sinon une erreur sera levée.
Cependant, pour les modules natifs de [Link], comme dans l'exemple ci-dessous, l'extension n'est pas
requise : import http from 'http';
Notions importantes
Lorsqu'on travaille avec les serveurs, nous utilisons des éléments essentiels pour communiquer efficacement :
les méthodes HTTP et les codes d'état (Status Codes). Ces deux concepts sont fondamentaux, surtout lors de la création
ou de l'utilisation d'APIs. Les comprendre et les maîtriser permettent de concevoir des applications robustes et
conformes aux standards. Voici une explication détaillée :
1. Les Méthodes HTTP
Les méthodes HTTP définissent l'action que le client (navigateur ou application) souhaite effectuer sur le
serveur. Chaque méthode correspond à une opération spécifique.
1.1. GET
- Utilisé pour récupérer des données depuis le serveur.
- Exemple : Obtenir les détails d'un produit.
- Propriété : Idempotente (appeler plusieurs fois produit le même résultat).
1.2. POST
- Utilisé pour envoyer des données au serveur pour créer une nouvelle ressource.
- Exemple : Ajouter un nouveau produit dans une base de données.
- Propriété : Non idempotente (chaque appel crée une nouvelle ressource).
1.3. PUT
- Utilisé pour mettre à jour ou remplacer une ressource existante.
- Exemple : Modifier les informations d'un produit.
- Propriété : Idempotente.
1.4. PATCH
- Utilisé pour mettre à jour partiellement une ressource.
- Exemple : Modifier uniquement le prix d’un produit sans toucher aux autres champs.
- Propriété : Idempotente.
1.5. DELETE
- Utilisé pour supprimer une ressource sur le serveur.
- Exemple : Supprimer un produit par son ID.
- Propriété : Idempotente.
2. Les Codes d'État HTTP (Status Codes)
Les codes d'état sont des réponses standards du serveur pour indiquer le résultat de la requête effectuée. Ils
sont divisés en catégories :
2.1 Codes d'Information
- Code ‘100’ => Continue
Indique que la requête initiale est correcte, le client peut continuer à envoyer les données.
2.2 Succès
- Code ‘200’ => OK
La requête a réussi, et les données demandées sont retournées.
- Exemple : Réponse d'une requête GET.
- Code ‘201’ => Created
Une nouvelle ressource a été créée avec succès.
- Exemple : Réponse d'une requête POST.
- Code ‘204’ => No Content
La requête a réussi, mais il n'y a pas de contenu à retourner.
- Exemple : Réponse après une suppression (DELETE).
2.3 Redirection
- Code ‘301 => Moved Permanently
La ressource demandée a été déplacée de façon permanente à une nouvelle URL.
- Code ‘302 => Found
La ressource demandée est temporairement accessible à une autre URL.
2.4 - Erreurs du Client
- Code ‘400’ => Bad Request
La requête est mal formée ou contient des données incorrectes.
- Exemple : JSON invalide dans le corps de la requête.
- Code ‘401’ => Unauthorized
Le client n'est pas authentifié pour accéder à la ressource.
- Exemple : Absence ou invalidité d’un token d'authentification.
- Code ‘403’ => Forbidden
Le client est authentifié, mais n'a pas les permissions nécessaires.
- Exemple : Tentative d'accès à une ressource protégée.
- Code ‘404’ => Not Found
La ressource demandée n'existe pas.
- Exemple : Requête pour un ID de produit inexistant.
- Code ‘422 => Unprocessable Entity
La requête est valide, mais ne peut pas être traitée.
- Exemple : Validation échouée pour un champ obligatoire.
2.5 Erreurs du Serveur
- Code ‘500’ => Internal Server Error
Une erreur interne s'est produite sur le serveur.
- Exemple : Problème dans le code serveur ou panne de la base de données.
- Code ‘502’ => Bad Gateway
Le serveur, en tant que passerelle, a reçu une réponse invalide d'un autre serveur.
- Code ‘503’ => Service Unavailable
Le serveur est temporairement indisponible (maintenance ou surcharge).
Résumé simplifié : Tableau des Méthodes et Codes
Code Catégorie Explication rapide
200 Succès Requête réussie
201 Succès Ressource créée
204 Erreur Client Pas de contenu à retourner
400 Erreur Client Requête invalide
401 Erreur Client Authentification requise
403 Erreur Client Accès refusé
404 Erreur Client Ressource non trouvée
500 Erreur Serveur Problème interne au serveur
En comprenant ces éléments, vous serez mieux préparé pour développer des APIs conformes aux standards et faciles à
intégrer. Car dans les chapitres suivants nous allons développer des APIs et ces codes et méthodes vont être utilisés.
Création d’un système CRUD avec [Link]
Dans ce chapitre, nous allons apprendre à construire une API RESTful simple pour gérer des produits en utilisant
[Link] et Express. Nous utiliserons Mongoose pour interagir avec MongoDB (pour les bases de données) , Nodemon
pour faciliter le développement, et Postman pour tester notre API. À la fin, notre API permettra de Créer, Lire, Mettre à
jour, et Supprimer des produits (CRUD).
Introduction
[Link] est un framework minimaliste pour [Link], conçu pour créer des applications web et des API. Il est
rapide, léger, et extensible, ce qui le rend idéal pour construire des applications serveur. Dans ce chapitre, nous allons
créer une API simple de CRUD (Create, Read, Update, Delete) pour gérer des produits. Nous utiliserons Express pour la
gestion des routes, Mongoose pour interagir avec MongoDB, Nodemon pour un rechargement automatique du serveur
pendant le développement, et Postman pour tester notre API.
Prérequis
Assurez-vous d’avoir :
[Link] installé sur votre machine.
Un serveur MongoDB opérationnel (local ou cloud comme MongoDB Atlas).
Postman installé pour tester les endpoints.
Étape 1 : Initialisation du projet
1. Créer le projet et initialiser [Link]
mkdir crud-api
cd crud-api
npm init –y
Cela génère un fichier `[Link]`.
2. Installer les dépendances nécessaires
npm install express mongoose
npm install -D nodemon
3. Configurer le script pour Nodemon
Dans le fichier `[Link]`, ajoutez ce script dans la partie script:
"scripts": {
"dev": "nodemon [Link]"
Étape 2 : Créer l’entrée principale du serveur
1. Créer un fichier `[Link]`
import express from 'express';
import mongoose from 'mongoose';
const app = express();
const PORT = 3000;
// Middleware pour analyser les requêtes JSON
[Link]([Link]());
// Connexion à MongoDB
[Link]('mongodb://[Link]:27017/productDB', {
useNewUrlParser: true,
useUnifiedTopology: true,
}).then(() => [Link]('MongoDB connecté'))
.catch(err => [Link]('Erreur MongoDB :', err));
// Définir une route simple pour tester
[Link]('/', (req, res) => {
[Link]('API en ligne !');
});
// Lancer le serveur
[Link](PORT, () => [Link](`Serveur lancé sur [Link]
Lancez le serveur avec :
npm run dev
Accédez à `[Link] dans votre navigateur ou via Postman pour tester.
Étape 3 : Modéliser les données
1. Créer un dossier `models`
mkdir models
2. Créer un fichier `[Link]` dans `models`
import mongoose from 'mongoose';
const productSchema = new [Link]({
name: { type: String, required: true },
price: { type: Number, required: true },
inStock: { type: Boolean, default: true },
});
const Product = [Link]('Product', productSchema);
export default Product;
Étape 4 : Ajouter les routes de CRUD
1. Créer un dossier `routes`
mkdir routes
2. Créer un fichier `[Link]` dans `routes`
import express from 'express';
import Product from '../models/[Link]';
const router = [Link]();
// CREATE - Ajouter un produit
[Link]('/', async (req, res) => {
try {
const product = new Product([Link]);
await [Link]();
[Link](201).json(product);
} catch (error) {
[Link](400).json({ error: [Link] });
});
// READ - Récupérer tous les produits
[Link]('/', async (req, res) => {
try {
const products = await [Link]();
[Link](products);
} catch (error) {
[Link](500).json({ error: [Link] });
});
// READ - Récupérer un produit par ID
[Link]('/:id', async (req, res) => {
try {
const product = await [Link]([Link]);
if (!product) return [Link](404).json({ message: 'Produit non trouvé' });
[Link](product);
} catch (error) {
[Link](500).json({ error: [Link] });
});
// UPDATE - Modifier un produit
[Link]('/:id', async (req, res) => {
try {
const product = await [Link]([Link], [Link], { new: true });
if (!product) return [Link](404).json({ message: 'Produit non trouvé' });
[Link](product);
} catch (error) {
[Link](400).json({ error: [Link] });
});
// DELETE - Supprimer un produit
[Link]('/:id', async (req, res) => {
try {
const product = await [Link]([Link]);
if (!product) return [Link](404).json({ message: 'Produit non trouvé' });
[Link]({ message: 'Produit supprimé avec succès' });
} catch (error) {
[Link](500).json({ error: [Link] });
});
export default router;
3. Connecter les routes dans `[Link]`
import productRoutes from './routes/[Link]';
[Link]('/api/products', productRoutes);
Étape 5 : Tester avec Postman
1. Lancer le serveur avec `npm run dev`.
2. Tester les endpoints :
Créer des produits
Methode : POST
URL : `[Link]
Body (JSON) :
"name": "Produit A",
"price": 100,
"inStock": true
Selectionner tous les produits:
Method : GET
URL : `[Link]
Selectionner un produit:
Method : GET
URL : `[Link]
Modifier un produit:
Method : PUT
URL : `[Link]
Body (JSON) :
"name": "Produit B",
"price": 150
Modifier un produit:
Method : DELETE
URL : `[Link]
Vous avez maintenant une API CRUD fonctionnelle avec [Link], Express, MongoDB et Mongoose. En utilisant
Postman, vous pouvez tester facilement chaque endpoint et valider leur bon fonctionnement. Cette structure modulaire
est extensible et prête pour un développement à grande échelle.