TW3 — Technologies du Web 3

Exercice — Serveur Express + lecture de fichier (et Git)

Construisez un petit serveur Express qui lit un fichier via fs, puis versionnez le tout avec Git, en appliquant Node.js, NPM et les bonnes pratiques.

Objectif : créer un serveur Node.js avec Express qui expose une route lisant un fichier via le module fs, puis versionner le projet avec Git. Vous pratiquez Node.js côté serveur, NPM, le montage Express et .gitignore.

Le projet : un serveur qui lit un fichier

Créez un dossier mini-serveur. Un index.ts (Express, port 3000) avec une route GET /readfile qui renvoie le contenu de data.txt. Ajoutez un .gitignore (node_modules), puis faites 4 commits Git jalons.

Étapes pas à pas

1. Initialiser et installer

npm init -y puis npm install express. Ajoutez node_modules/ au .gitignore.

2. Créer le serveur Express

import express from "express" puis const app = express().

Activez le parsing JSON :

import express from "express"
const app = express()
app.use(express.json())

3. La route /readfile

Dans le handler, lisez data.txt avec fs.readFile (ou fs.readFileSync pour un premier test simple) et renvoyez le contenu.

import express from "express"
import { readFile } from "node:fs/promises"
import { join, dirname } from "node:path"
import { fileURLToPath } from "node:url"

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

const app = express()

app.get("/readfile", async (req, res) => {
  try {
    const data = await readFile(join(__dirname, "data.txt"), "utf8")
    res.send(data)
  } catch {
    res.status(500).send("Erreur de lecture")
  }
})

4. Versionner avec Git

4 commits : (1) init + package.json, (2) serveur Express, (3) route /readfile, (4) .gitignore + data.txt.

Le projet complet

import express from "express"
import { readFile } from "node:fs/promises"
import { join, dirname } from "node:path"
import { fileURLToPath } from "node:url"

const __filename = fileURLToPath(import.meta.url)
const __dirname = dirname(__filename)

const app = express()
const PORT = 3000

app.get("/readfile", async (req, res) => {
  try {
    const data = await readFile(join(__dirname, "data.txt"), "utf8")
    res.send(data)
  } catch {
    res.status(500).send("Erreur de lecture")
  }
})

app.listen(PORT, () => {
  console.log(`Serveur sur http://localhost:${PORT}`)
})
echo "Hello Node.js" > data.txt
npx tsx src/index.ts
# curl http://localhost:3000/readfile -> Hello Node.js

Conseils

  • express() (avec les parenthèses) crée l'application ; ne faites pas require("express") seul.
  • Préférez le callback asynchrone de fs.readFile en production ; readFileSync bloque le thread (OK pour un test).
  • Testez le serveur avec curl ou le navigateur avant de commiter.

⚠️ Pièges à éviter

Versionner node_modules : ajoutez-le au .gitignore. Il se régénère via npm install grâce au package-lock.json.

require("express") sans appel : avec ESM, importez Express :

import express from "express"
const app = express()

L'appel express() est nécessaire pour instancier l'application.

Port déjà utilisé : si EADDRINUSE, changez le PORT ou libérez le processus. Ne forcez pas 3000 si occupé.

Chemins relatifs de fs : ils sont relatifs au répertoire de démarrage, pas au fichier source. Pour être robuste, construisez le chemin avec path.join(__dirname, "data.txt").

Critères de réussite

  • Serveur Express démarrant sur le port 3000.
  • Route /readfile renvoyant le contenu de data.txt.
  • node_modules ignoré par Git.
  • 4 commits Git jalons propres.

Pour aller plus loin

Relisez Introduction à Node.js avant le quiz.

Node.js

Terminez le quiz du chapitre pour le marquer comme complété.

Tableau de bord

On this page