Requêtes et réponses
Exploiter l'objet req (params, query, body, headers) et construire des réponses avec res et les bons codes HTTP.
Chaque handler Express reçoit deux objets : l'un décrit ce que le client demande, l'autre sert à lui répondre. Les maîtriser, c'est écrire des API prévisibles.
📥 L'objet req
Les principales propriétés de l'objet req (Request) transmis à chaque handler :
Prop
Type
app.post("/api/users/:id/messages", (req, res) => {
const { id } = req.params;
const { brouillon } = req.query;
const { contenu } = req.body;
const langue = req.headers["accept-language"];
res.status(201).json({ id, brouillon, contenu, langue });
});req.body vaut undefined si aucun parseur n'est branché. Pour du JSON, app.use(express.json()) est indispensable.
📤 L'objet res
res.status(201).json({ id: 12 }); // JSON + code
res.send("<h1>Bonjour</h1>"); // HTML ou texte
res.status(204).end(); // aucun contenu
res.redirect(302, "/connexion"); // redirection
res.set("X-Total-Count", "42").json(liste);// en-tête personnaliséLes principales méthodes de l'objet res (Response) :
Prop
Type
Points d'attention :
res.json()sérialise et poseContent-Type: application/json;res.send()devine le type selon l'argument (chaîne → HTML, objet → JSON) ;- ces méthodes terminent la réponse : en appeler deux provoque l'erreur
Cannot set headers after they are sent.
// ❌ deux réponses pour une requête
app.get("/ko", (req, res) => {
res.json({ a: 1 });
res.json({ b: 2 }); // ERR_HTTP_HEADERS_SENT
});
// ✅ un return coupe l'exécution
app.get("/ok", (req, res) => {
if (!req.query.id) return res.status(400).json({ error: "id requis" });
res.json({ id: req.query.id });
});🔢 Choisir le bon code HTTP
| Code | Quand l'utiliser |
|---|---|
| 200 | Lecture ou mise à jour réussie avec contenu |
| 201 | Ressource créée (POST) — ajouter l'en-tête Location |
| 204 | Succès sans corps (DELETE typiquement) |
| 400 | Requête mal formée ou données invalides |
| 401 | Authentification absente ou invalide |
| 403 | Authentifié mais non autorisé |
| 404 | Ressource inexistante |
| 409 | Conflit (doublon d'email, par exemple) |
| 422 | Entité bien formée mais sémantiquement invalide |
| 500 | Erreur inattendue du serveur |
Règle mnémotechnique : 2xx ça marche, 4xx la faute vient du client, 5xx la faute vient du serveur.
app.post("/api/articles", (req, res) => {
if (!req.body?.titre) {
return res.status(400).json({ error: "Le titre est obligatoire" });
}
const article = { id: 12, ...req.body };
res.status(201).location(`/api/articles/${article.id}`).json(article);
});🧾 Une forme de réponse cohérente
Standardisez le format d'erreur pour que le client n'ait qu'un cas à traiter :
{ "error": "Article introuvable", "code": "ARTICLE_NOT_FOUND" }✅ Points clés
paramsidentifie,queryfiltre,bodytransporte les données,headersporte les métadonnées.- Une requête = une seule réponse ; utilisez
returnavantres. - 201 pour une création, 204 pour une suppression réussie.
Express
Terminez le quiz du chapitre pour le marquer comme complété.