Was macht Body-Parser mit Express?

337

Ich verstehe nicht, warum wir body-parserin einer Express-Anwendung benötigen , da wir Daten ohne Verwendung abrufen können body-parser. Und was macht es eigentlich und wie?

jiten
quelle
54
Um HTTP-POST-Daten lesen zu können, müssen wir das Knotenmodul "body-parser" verwenden. body-parser ist eine Express-Middleware, die die Eingabe eines Formulars liest und als Javascript-Objekt speichert, auf das überreq.body
refactor
2
Mit Express können Sie alle Daten in HTTP-Anforderungen lesen, z. B. Header req.headers(Array). Sie können den req.bodyText des http-Pakets lesen, wie in @CleanCrispCode erläutert, und Sie können als Abfrageparameter lesen. Dies req.query.variablehilft, da Express die Anforderung automatisch in Javascript umwandelt Objekte
Fernando Zamperin
3
@refactor - Dies mag einer der vielen Gründe sein, warum wir Body Parser verwenden müssen, aber es sagt nichts darüber aus, was es tut, dh dass HTTP-Anforderungs- und Antwortobjekte Streams sind und nicht als einzelnes Objekt "lesbar" sind wie res.bodyohne dass der gesamte Stream zuerst gepuffert wird res.body.
Ortonomie
1
In Express Version 4.16+ ist eine eigene Version des integrierten Body-Parsers enthalten, sodass Sie dieses Paket nicht abrufen müssen.
StefanBob

Antworten:

254

Um HTTP POSTAnfragen in Express.js Version 4 und höher zu bearbeiten , müssen Sie das aufgerufene Middleware-Modul installieren body-parser.

body-parserExtrahieren Sie den gesamten Body-Teil eines eingehenden Anforderungsstroms und machen Sie ihn verfügbar req.body.

Die Middleware war früher Teil von Express.js, aber jetzt müssen Sie sie separat installieren.

Dieses body-parserModul analysiert die JSON-, Puffer-, Zeichenfolgen- und URL-codierten Daten, die auf HTTP POSTAnfrage übermittelt wurden . Installieren Sie body-parsermit NPM wie unten gezeigt.

npm install body-parser --save

bearbeiten in 2019-april-2: in [email protected] die mit Express gebündelte Body-Parser-Middleware. Weitere Details finden Sie hier

Malatesh Patil
quelle
125
Dies ist wahrscheinlich die lahmste Sache überhaupt. Warum sollten Express-Core-Entwickler es Neulingen unglaublich schwer machen, an Bord zu kommen, indem sie zusätzliche Middleware für die häufigsten Anwendungsfälle in der Webentwicklung installieren?
Elmt
5
@elmt, wenn Sie etwas mit Meinungen wollen, versuchen Sie Segel.js
George
1
@ user1063287 ja das tut es. urlencoded()und json()sind tatsächlich Middleware-Fabriken, die eine Middleware-Funktion zurückgeben, die aufruftnext()
Nick Manning
3
Es ist nicht lahm @elmt, der Knoten ist nicht nur für das Web gedacht, er kann auch auf Desktops, Mobilgeräten usw. verwendet werden und ist in diesen Fällen kein erforderliches Modul. Knoten kann sich ohne jegliche Haftung an Ihre Anwendung anpassen
fnaquira
27
@fnaquira - Du bist verwirrt. Hier geht es um Express nicht um Knoten.
Elmt
84

Ja, wir können ohne arbeiten body-parser. Wenn Sie dies nicht verwenden, erhalten Sie die unformatierte Anforderung, und Ihr Textkörper und Ihre Header befinden sich nicht im Stammobjekt des Anforderungsparameters. Sie müssen alle Felder einzeln bearbeiten.

Oder Sie können verwenden body-parser, wie das Express-Team es wartet.

Was Body-Parser für Sie tun kann: Es vereinfacht die Anfrage.
Wie man es benutzt: Hier ist ein Beispiel:

Installieren npm install body-parser --save

So verwenden Sie Body-Parser im Express:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

Verknüpfung.

https://github.com/expressjs/body-parser .

Und dann können Sie Body und Header im Root-Anforderungsobjekt abrufen. Beispiel

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})
Himanshu Sharma
quelle
3
Hey danke für die Info, kannst du ein Codebeispiel ohne Body Parser posten?
Ilyas Karim
55

Die Antwort hier erklärt es sehr detailliert und brillant, die Antwort enthält:

Zusamenfassend; Der Body-Parser extrahiert den gesamten Body-Teil eines eingehenden Anforderungsstroms und macht ihn req.bodyals etwas verfügbar, mit dem die Schnittstelle einfacher ist. Sie brauchen es nicht per se, weil Sie das alles selbst machen könnten. Es wird jedoch höchstwahrscheinlich das tun, was Sie wollen, und Ihnen die Mühe ersparen.


Um etwas tiefer zu gehen; body- parser bietet Ihnen eine Middleware, die nodejs / zlib verwendet , um die eingehenden Anforderungsdaten zu entpacken, wenn sie komprimiert sind, und stream-utils / raw-body , um den vollständigen, rohen Inhalt des Anforderungshauptteils abzuwarten, bevor er "analysiert" wird (dies bedeutet, dass if Sie wollten den Anfragetext nicht verwenden, Sie haben nur einige Zeit verschwendet.

Nachdem der Rohinhalt vorhanden ist, analysiert Body-Parser ihn mit einer von vier Strategien, abhängig von der spezifischen Middleware, für die Sie sich entschieden haben:

  • bodyParser.raw () : Analysiert den Body nicht wirklich, sondern macht nur den gepufferten Inhalt von zuvor in einem Buffer on verfügbarreq.body .

  • bodyParser.text () : Liest den Puffer als einfachen Text und macht die resultierende Zeichenfolge in req.body verfügbar.

  • bodyParser.urlencoded () : Analysiert den Text als URL-codierte Daten (so senden Browser in der Regel Formulardaten aus regulären Formularen, die auf POST festgelegt sind) und macht das resultierende Objekt (das die Schlüssel und Werte enthält) verfügbar req.body. Zum Vergleich; In PHP wird dies alles automatisch erledigt und in angezeigt $_POST.

  • bodyParser.json () : Analysiert den Text als JSON und macht das resultierende Objekt verfügbar req.body.

Erst nachdem req.bodyder gewünschte Inhalt eingestellt wurde, wird die nächste Middleware im Stapel aufgerufen, die dann auf die Anforderungsdaten zugreifen kann, ohne darüber nachdenken zu müssen, wie sie entpackt und analysiert werden sollen.

Sie können sich auf den Body-Parser- Github beziehen, um dessen Dokumentation zu lesen. Er enthält Informationen zur Funktionsweise.

Suraj Jain
quelle
47

Versuchen wir, dies am wenigsten technisch zu halten.

Angenommen, Sie senden HTML-Formulardaten an den Server von node-js, dh Sie haben eine Anfrage an den Server gestellt. Die Serverdatei würde Ihre Anfrage unter einem Anfrageobjekt empfangen. Wenn Sie nun logischerweise dieses Anforderungsobjekt in Ihrer Serverdatei protokollieren, sollten Sie Ihre Formulardaten an einer bestimmten Stelle sehen, die dann extrahiert werden könnte, aber whoa! das tust du eigentlich nicht!

Wo sind unsere Daten? Wie werden wir es extrahieren, wenn es nicht nur in meiner Anfrage vorhanden ist?

Eine einfache Erklärung dafür ist, dass http Ihre Formulardaten in Teilen sendet, die zusammengestellt werden sollen, sobald sie ihr Ziel erreichen. Wie würden Sie Ihre Daten extrahieren?

Aber warum sollten Sie sich die Mühe machen, Ihre Daten jedes Mal manuell nach Blöcken zu analysieren und zusammenzustellen? Verwenden Sie etwas namens "Body-Parser", das dies für Sie tun würde.

body-parser analysiert Ihre Anfrage und konvertiert sie in ein Format, aus dem Sie auf einfache Weise relevante Informationen extrahieren können, die Sie möglicherweise benötigen.

Angenommen, Sie haben ein Anmeldeformular an Ihrem Frontend. Sie füllen es aus und fordern den Server auf, die Details irgendwo zu speichern.

Das Extrahieren von Benutzername und Passwort aus Ihrer Anfrage ist so einfach wie unten, wenn Sie Body-Parser verwenden.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

Im Grunde genommen hat der Body-Parser Ihre eingehende Anfrage analysiert, die Blöcke mit Ihren Formulardaten zusammengestellt, dieses Body-Objekt für Sie erstellt und mit Ihren Formulardaten gefüllt.

Abzy
quelle
10

Es analysiert den HTTP-Anforderungshauptteil. Dies ist normalerweise erforderlich, wenn Sie mehr als nur die URL kennen müssen, die Sie getroffen haben, insbesondere im Zusammenhang mit einer POST- oder PUT PATCH-HTTP-Anforderung, bei der die gewünschten Informationen im Text enthalten sind.

Grundsätzlich handelt es sich um eine Middleware zum Parsen von JSON, einfachem Text oder zum Zurückgeben eines rohen Pufferobjekts, mit dem Sie nach Bedarf umgehen können.

Deepak Patidar
quelle
8

Um Zugriff auf die Postdaten zu erhalten, müssen wir verwenden body-parser. Grundsätzlich ist es das, body-parserwas es ausdrückt, den Körper zu lesen und ihn dann in ein JsonObjekt zu zerlegen, das wir verstehen können.

Satish Kuppili
quelle
7

Dies alles ist eine Frage der Bequemlichkeit.

Grundsätzlich, wenn die Frage war ‚Haben wir müssen verwenden body-parser?‘ Die Antwort ist nein'. Wir können die gleichen Informationen aus der Client-Post-Anfrage auf einer umständlicheren Route erhalten, die im Allgemeinen weniger flexibel ist und die Menge an Code erhöht, die wir schreiben müssen, um die gleichen Informationen zu erhalten.

Dies ist eine Art der gleichen wie die Frage ‚Haben wir müssen verwenden expressbeginnen?‘ Wieder ist die Antwort, dass es nein gibt, und wieder kommt es wirklich darauf an, uns den Aufwand zu ersparen, mehr Code zu schreiben, um die grundlegenden Dinge zu tun, die mit "eingebaut" verbunden sind.

Oberflächlich betrachtet - body-parsererleichtert das Abrufen der in Clientanforderungen enthaltenen Informationen in verschiedenen Formaten, anstatt die Rohdatenströme zu erfassen und herauszufinden, in welchem ​​Format die Informationen vorliegen, und noch weniger, diese Informationen manuell in verwendbare Daten zu analysieren.

Rich Werden
quelle
6

Anforderungskörper verstehen

Beim Empfang einer POST- oder PUT-Anfrage kann der Anfragetext für Ihre Anwendung wichtig sein. Das Abrufen der Körperdaten ist etwas aufwändiger als der Zugriff auf Anforderungsheader. Das an einen Handler übergebene Anforderungsobjekt implementiert die ReadableStream-Schnittstelle. Dieser Stream kann wie jeder andere Stream an anderer Stelle angehört oder weitergeleitet werden. Wir können die Daten direkt aus dem Stream holen, indem wir die Ereignisse 'Daten' und 'Ende' des Streams abhören.

Der in jedem 'Daten'-Ereignis ausgegebene Block ist ein Puffer. Wenn Sie wissen, dass es sich um Zeichenfolgendaten handelt, sammeln Sie die Daten am besten in einem Array und verketten und stringifizieren Sie sie am Ende.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

Body-Parser verstehen

Gemäß seiner Dokumentation

Analysieren Sie eingehende Anforderungskörper in einer Middleware vor Ihren Handlern, die unter der Eigenschaft req.body verfügbar sind.

Wie Sie im ersten Beispiel gesehen haben, mussten wir den eingehenden Anforderungsstrom manuell analysieren, um den Text zu extrahieren. Dies ist etwas mühsam, wenn mehrere Formulardaten unterschiedlichen Typs vorhanden sind. Wir verwenden also das Body-Parser-Paket, das all diese Aufgaben unter der Haube erledigt.

Es bietet vier Module zum Parsen verschiedener Datentypen

Nachdem der Raw-Content-Body-Parser eine der oben genannten Strategien verwendet hat (abhängig von der Middleware, für die Sie sich entschieden haben), werden die Daten analysiert. Sie können mehr über sie lesen, indem Sie ihre Dokumentation lesen.

Nach dem Festlegen von req.bodyauf den analysierten Body next()ruft Body-Parser auf , um die nächste Middleware im Stack aufzurufen , die dann auf die Anforderungsdaten zugreifen kann, ohne darüber nachdenken zu müssen, wie sie entpackt und analysiert werden sollen.

Himansh
quelle