Pourquoi Node.js pour le backend
Node.js permet d’utiliser JavaScript (ou TypeScript) côté serveur. Son modèle événementiel non-bloquant le rend particulièrement adapté aux API web et aux applications temps réel.
Chez Lueur Externe, nous utilisons Node.js pour les API, les fonctions serverless (comme le handler de contact de ce site) et les scripts d’automatisation.
L’architecture événementielle
Event Loop
Node.js traite les requêtes de manière asynchrone grâce à l’event loop :
Requête entrante
│
▼
Event Loop ──► Opération I/O (DB, fichier, réseau)
│ │
│ ▼
│ Callback/Promise
│ │
◄────────────────────┘
│
▼
Réponse envoyée
Ce modèle permet de gérer des milliers de connexions simultanées avec un seul thread.
Quand Node.js excelle
- API REST et GraphQL
- Applications temps réel (WebSocket)
- Microservices
- Fonctions serverless (AWS Lambda)
- Scripts CLI et automatisation
Quand éviter Node.js
- Calculs CPU intensifs (préférez Go, Rust ou Python)
- Applications nécessitant du multithreading natif
Frameworks backend
Express.js
Le framework le plus populaire, minimaliste et flexible :
import express from "express";
const app = express();
app.use(express.json());
app.get("/api/articles", async (req, res) => {
const articles = await getArticles();
res.json({ data: articles });
});
app.listen(3000);
Fastify
Plus performant qu’Express, avec validation de schéma intégrée :
import Fastify from "fastify";
const app = Fastify({ logger: true });
app.get("/api/articles", {
schema: {
response: {
200: {
type: "object",
properties: {
data: { type: "array" }
}
}
}
}
}, async () => {
return { data: await getArticles() };
});
await app.listen({ port: 3000 });
Hono
Ultra-léger, conçu pour les edge runtimes :
import { Hono } from "hono";
const app = new Hono();
app.get("/api/articles", async (c) => {
const articles = await getArticles();
return c.json({ data: articles });
});
export default app;
Structure de projet
src/
├── routes/ # Définition des routes
│ ├── articles.ts
│ └── auth.ts
├── controllers/ # Logique métier
│ ├── articles.ts
│ └── auth.ts
├── services/ # Couche service
│ └── article.service.ts
├── models/ # Modèles de données
│ └── article.model.ts
├── middleware/ # Middlewares
│ ├── auth.ts
│ └── validation.ts
├── utils/ # Utilitaires
└── index.ts # Point d'entrée
Bonnes pratiques
Gestion des erreurs
// Middleware de gestion d'erreurs centralisé
app.use((err: Error, req: Request, res: Response, next: NextFunction) => {
console.error(err.stack);
res.status(500).json({
error: {
code: "INTERNAL_ERROR",
message: "Une erreur interne est survenue"
}
});
});
Validation des entrées
Utilisez Zod pour valider les données entrantes :
import { z } from "zod";
const createArticleSchema = z.object({
title: z.string().min(10).max(100),
content: z.string().min(100),
category: z.string(),
});
Variables d’environnement
Ne jamais hardcoder les secrets :
import { z } from "zod";
const envSchema = z.object({
DATABASE_URL: z.string().url(),
JWT_SECRET: z.string().min(32),
PORT: z.coerce.number().default(3000),
});
export const env = envSchema.parse(process.env);
Tests
Testez vos API avec Vitest et Supertest :
import { describe, it, expect } from "vitest";
import request from "supertest";
import { app } from "../src/app";
describe("GET /api/articles", () => {
it("returns a list of articles", async () => {
const res = await request(app).get("/api/articles");
expect(res.status).toBe(200);
expect(res.body.data).toBeInstanceOf(Array);
});
});
C’est l’approche que nous utilisons chez Lueur Externe pour garantir la fiabilité de nos API.
Conclusion
Node.js est une plateforme mature et performante pour le développement backend. Avec TypeScript, un framework adapté et de bonnes pratiques, vous construisez des API robustes et maintenables. Contactez Lueur Externe pour vos projets backend.