Menu

req.params, req.query et req.body dans Express expliqués

req.params contient les parties nommées du chemin (/users/:id), req.query la query string (?sort=new), et req.body le corps de la requête parsé, qui vaut undefined tant que vous n'ajoutez pas un parser comme express.json().

Cette page contient des éditeurs exécutables. Modifiez, exécutez et voyez la sortie instantanément.

Dans Express, req.params contient les valeurs des segments nommés du chemin de la route (/users/:id donne req.params.id), req.query contient la query string après le ? (/search?q=node donne req.query.q), et req.body contient les données envoyées dans le corps de la requête. req.params et req.query sont remplis à chaque requête, mais req.body reste undefined tant qu'un parser comme app.use(express.json()) ne l'a pas lu. Les valeurs de params et de query sont toujours des chaînes.

La première requête répond {"params":{"userId":"7"},"query":{"sort":"new","limit":"2"}}. Remarquez les guillemets : 7 et 2 sont des chaînes, donc convertissez-les avec Number() avant de faire des calculs ou de les comparer à des nombres. Passez maintenant la méthode en POST, gardez le chemin /users/7/posts et envoyez le corps {"title": "Hello", "draft": true} : la réponse est 201 avec "body":{"title":"Hello","draft":true}, où true est un vrai booléen puisqu'il vient du JSON.

req.params, req.query ou req.body

req.paramsreq.queryreq.body
Vient deLe chemin, /users/:idLa query string, ?sort=newLe corps de la requête
Exemple d'URL ou de corps/users/7/users?sort=new{"name": "Ada"}
Valeur{ id: '7' }{ sort: 'new' }{ name: 'Ada' }
TypesChaînesChaînes et tableaux de chaînesCe que contient le JSON
ConfigurationUn :name dans la routeAucuneapp.use(express.json())
Usage courantQuelle ressourceFiltrer, trier, paginerLes données à créer ou modifier

Une route peut avoir plusieurs paramètres, et chaque nom devient une clé de req.params : /teams/:teamId/members/:memberId donne les deux identifiants. Un tiret ou un point les sépare aussi, donc /flights/:from-:to transforme /flights/LAX-SFO en { from: 'LAX', to: 'SFO' }.

req.query avec des clés répétées ou absentes

Une clé qui apparaît deux fois devient un tableau, et une clé absente vaut undefined, donc donnez une valeur par défaut aux options :

La réponse est {"page":1,"tags":["red","sale"],"raw":{"tag":["red","sale"]}}. Envoyez GET /products?tag=red&page=3 et tags reste un tableau, ["red"], car [].concat() transforme une chaîne ou un tableau en tableau. Express 5 parse les query strings avec le parser simple de Node, donc ?filter[size]=m donne la clé "filter[size]", pas un objet imbriqué ; Express 4 l'imbriquait.

req.body a besoin d'express.json()

Node fournit le corps sous forme de stream d'octets. express.json() le lit, le parse et définit req.body, mais seulement quand la requête a Content-Type: application/json. Les formulaires HTML envoient application/x-www-form-urlencoded, qui demande plutôt express.urlencoded().

Envoyez POST /signup avec le corps {"email": "ada@example.com"} et vous obtenez 201 avec {"email":"ada@example.com","name":"anonymous"}. Envoyez un corps vide et vous obtenez 400. Le ?? {} compte : sans lui, déstructurer undefined lève une TypeError pour toute requête sans corps JSON. Pour valider vraiment la forme et les types, utilisez une bibliothèque de schémas comme zod.

req.headers et req.get()

req.headers est un objet avec tous les en-têtes de la requête, aux noms en minuscules. req.get(name) lit un en-tête sans tenir compte de la casse, donc req.get('Content-Type') et req.get('content-type') renvoient la même valeur. Quelques autres propriétés que vous utiliserez :

path vaut /whoami et originalUrl vaut /whoami?debug=1. Ajoutez l'en-tête Authorization: Bearer abc dans la barre de requête et renvoyez-la : token devient "Bearer abc". Dans un router monté avec app.use('/api', router), req.path perd le préfixe /api alors que req.originalUrl le garde (le routing Express explique le montage).

Erreurs fréquentes

Lire req.body dans une requête GET. Les navigateurs et la plupart des clients n'envoient pas de corps avec GET. Mettez les options d'un GET dans la query string.

Tester un flag de query comme un booléen. ?admin=false donne la chaîne 'false', qui est truthy, donc if (req.query.admin) passe. Comparez des chaînes : req.query.admin === 'true'.

Envoyer du JSON sans l'en-tête. Un client qui poste du JSON en text/plain obtient req.body === undefined. Définissez Content-Type: application/json côté client.

Questions fréquentes

Comment obtenir l'adresse IP du client dans Express ?

Lisez req.ip. Derrière un proxy ou un load balancer, c'est l'adresse du proxy tant que vous n'avez pas défini app.set('trust proxy', 1), qui fait lire à Express l'en-tête X-Forwarded-For à la place.

Comment obtenir l'URL complète d'une requête dans Express ?

req.originalUrl contient le chemin plus la query string tels que le client les a envoyés. Construisez l'URL absolue avec `${req.protocol}://${req.get('host')}${req.originalUrl}`.

Comment gérer l'upload de fichiers dans Express ?

Les uploads de fichiers arrivent en multipart/form-data, que express.json() et express.urlencoded() ne parsent pas. Utilisez un package comme multer, qui place les fichiers dans req.file ou req.files et les autres champs dans req.body.

Comment lire un cookie dans la requête ?

L'en-tête brut est dans req.get('cookie'). Pour obtenir un objet dans req.cookies, installez le package cookie-parser et ajoutez app.use(cookieParser()).

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

Commencer