Wie bodyParser() funktioniert

Unter der Haube

Ok Adam, genug mit dem BS. Ich verstehe, wie Middlware funktioniert. Aber wenn ich bodyParser nicht verwende und das req-Objekt auslogge, bekomme ich nur dieses riesige Ding und kann meine Daten nirgends finden. Ich verstehe, wie eine Middlware so etwas wie req.body = constructBody(req.data) machen kann, aber ich kann req.data nicht finden!!!

Wenn du diese Frage stellst, bist du hier richtig! Das hat mich auch eine Weile verwirrt. Wenn Sie wie ich sind, können Sie so etwas nicht „einfach akzeptieren“. Ich könnte akzeptieren, dass man, wenn die Daten vorhanden sind, einige Manipulationen an ihnen vornehmen kann, um req.body zu erhalten. Ich muss nicht genau verstehen, wie diese Manipulationen aussehen. Aber wenn die Daten gar nicht da sind, wie zum Teufel kann man dann die Manipulationen durchführen und req.body erhalten?!!!

Lassen Sie es mich Ihnen zeigen.

Die kurze Antwort ist, dass es ungefähr so funktioniert:

app.use(function( req, res, next ) {
var data = '';
req.on('data', function( chunk ) {
data += chunk;
});
req.on('end', function() {
req.rawBody = data;
console.log( 'on end: ', data )
if (data && data.indexOf('{') > -1 ) {
req.body = JSON.parse(data);
}
next();
});
});

Die lange Antwort ist, dass man Streams verstehen muss. Um Streams zu verstehen, müssen Sie verstehen, dass Informationen über das Internet in Form von Paketen gesendet werden.

Ich gehe davon aus, dass Sie das Video ein wenig gesehen haben und eine Vorstellung davon haben, wie Pakete funktionieren. Der nächste Schritt ist, die Stream-Abstraktion zu verstehen, mit der du in Node arbeiten wirst.

Die Idee mit Streams ist, dass du so etwas machen könntest:

req.on('data', function(chunk) {
// here's the chunk
});

Jedes Mal, wenn ein Stück der Daten ankommt, kannst du es verwenden. So könnte die Zeichenkette

abcdefghijklmnopqrstuvwxyz

in 5 Chunks

abcde
fghij
klmno
pqrst
uvwxyz

kommen und man könnte auf jedes Chunk zugreifen.

So wie ich das verstehe, muss man die Postdaten aus dem Stream holen, wenn man darauf zugreifen will. D.h. sie sind nicht nur auf dem req Objekt verfügbar.

Sieh dir https://www.github.com/substack/stream-adventure an, um ein besseres Verständnis der Funktionsweise von Streams zu bekommen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.