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 wiereq.body = constructBody(req.data)
machen kann, aber ich kannreq.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.