Menu

Express req.params, req.query und req.body erklärt

req.params enthält die benannten Teile des Pfads (/users/:id), req.query den Query-String (?sort=new) und req.body den geparsten Request-Body, der undefined bleibt, bis du einen Body-Parser wie express.json() hinzufügst.

Diese Seite enthält ausführbare Editoren. Bearbeiten, ausführen und Ausgabe sofort sehen.

In Express enthält req.params die Werte benannter Segmente im Routenpfad (/users/:id ergibt req.params.id), req.query den Query-String nach dem ? (/search?q=node ergibt req.query.q) und req.body die Daten, die im Request-Body gesendet wurden. req.params und req.query sind bei jeder Anfrage gefüllt, aber req.body bleibt undefined, bis ein Body-Parser wie app.use(express.json()) ihn liest. Werte in params und query sind immer Strings.

Die erste Anfrage antwortet mit {"params":{"userId":"7"},"query":{"sort":"new","limit":"2"}}. Achte auf die Anführungszeichen: 7 und 2 sind Strings, wandle sie also mit Number() um, bevor du rechnest oder mit Zahlen vergleichst. Stell jetzt die Methode auf POST, lass den Pfad /users/7/posts und sende den Body {"title": "Hello", "draft": true}: Die Antwort ist 201 mit "body":{"title":"Hello","draft":true}, wobei true ein echter Boolean ist, weil er aus JSON kommt.

req.params vs. req.query vs. req.body

req.paramsreq.queryreq.body
Kommt ausDem Pfad, /users/:idDem Query-String, ?sort=newDem Request-Body
Beispiel-URL oder Body/users/7/users?sort=new{"name": "Ada"}
Wert{ id: '7' }{ sort: 'new' }{ name: 'Ada' }
TypenStringsStrings und Arrays von StringsWas auch immer das JSON enthält
Braucht SetupEin :name in der RouteNichtsapp.use(express.json())
Typischer EinsatzWelche RessourceFiltern, Sortieren, SeitenDaten zum Anlegen oder Ändern

Eine Route kann mehrere Parameter haben, und jeder Name wird zu einem Schlüssel von req.params: /teams/:teamId/members/:memberId liefert beide IDs. Auch ein Bindestrich oder ein Punkt trennt sie, deshalb wird /flights/LAX-SFO mit /flights/:from-:to zu { from: 'LAX', to: 'SFO' }.

req.query mit doppelten und fehlenden Schlüsseln

Ein Schlüssel, der zweimal vorkommt, wird zu einem Array, und ein fehlender Schlüssel ist undefined, also gib Optionen einen Standardwert:

Die Antwort ist {"page":1,"tags":["red","sale"],"raw":{"tag":["red","sale"]}}. Sende GET /products?tag=red&page=3, und tags ist immer noch ein Array, ["red"], weil [].concat() aus einem String oder einem Array ein Array macht. Express 5 parst Query-Strings mit dem einfachen Parser von Node, ?filter[size]=m ergibt also den Schlüssel "filter[size]", kein verschachteltes Objekt; Express 4 hat es verschachtelt.

req.body braucht express.json()

Node liefert den Body als Stream von Bytes. express.json() liest ihn, parst ihn und setzt req.body, aber nur, wenn die Anfrage Content-Type: application/json hat. HTML-Formulare senden application/x-www-form-urlencoded, das stattdessen express.urlencoded() braucht.

Sende POST /signup mit dem Body {"email": "ada@example.com"}, und du bekommst 201 mit {"email":"ada@example.com","name":"anonymous"}. Sende einen leeren Body, und du bekommst 400. Das ?? {} ist wichtig: Ohne es wirft das Destructuring von undefined bei jeder Anfrage ohne JSON-Body einen TypeError. Für eine echte Prüfung von Form und Typen nimm eine Schema-Bibliothek wie zod.

req.headers und req.get()

req.headers ist ein Objekt mit allen Request-Headern, mit kleingeschriebenen Namen. req.get(name) liest einen Header und ignoriert Groß- und Kleinschreibung, req.get('Content-Type') und req.get('content-type') liefern also denselben Wert. Ein paar weitere Eigenschaften, die du brauchen wirst:

path ist /whoami und originalUrl ist /whoami?debug=1. Füg in der Request-Leiste den Header Authorization: Bearer abc hinzu und sende noch einmal: token wird zu "Bearer abc". In einem Router, der mit app.use('/api', router) eingehängt ist, verliert req.path das Präfix /api, während req.originalUrl es behält (Express Routing erklärt das Einhängen).

Häufige Fehler

req.body bei einer GET-Anfrage lesen. Browser und die meisten Clients senden bei GET keinen Body. Pack GET-Optionen in den Query-String.

Ein Query-Flag auf Truthiness prüfen. ?admin=false ergibt den String 'false', der truthy ist, also geht if (req.query.admin) durch. Vergleich Strings: req.query.admin === 'true'.

JSON ohne den Header senden. Ein Client, der JSON als text/plain postet, bekommt req.body === undefined. Setz auf dem Client Content-Type: application/json.

Häufig gestellte Fragen

Wie bekomme ich in Express die IP-Adresse des Clients?

Lies req.ip. Hinter einem Proxy oder Load Balancer ist das die Adresse des Proxys, bis du app.set('trust proxy', 1) setzt, dann liest Express stattdessen den Header X-Forwarded-For.

Wie bekomme ich in Express die vollständige URL einer Anfrage?

req.originalUrl ist der Pfad plus Query-String, so wie der Client ihn geschickt hat. Die absolute URL baust du mit `${req.protocol}://${req.get('host')}${req.originalUrl}`.

Wie verarbeite ich Datei-Uploads in Express?

Datei-Uploads kommen als multipart/form-data, das express.json() und express.urlencoded() nicht parsen. Nimm ein Paket wie multer, das die Dateien in req.file oder req.files und die übrigen Felder in req.body legt.

Wie lese ich ein Cookie aus der Anfrage?

Der rohe Header steht in req.get('cookie'). Für ein Objekt in req.cookies installierst du das Paket cookie-parser und fügst app.use(cookieParser()) hinzu.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

Los geht's