Hoe bodyParser() werkt
Under the Hood
Ok Adam, genoeg met die BS. Ik begrijp hoe middlware werkt. Maar als ik bodyParser niet gebruik en het
req
-object uitlog, krijg ik alleen dit enorme ding en kan ik mijn gegevens nergens vinden. Ik begrijp hoe een middlware zoiets alsreq.body = constructBody(req.data)
kan doen, maar ik kanreq.data
niet vinden!!
Als je die vraag stelt, ben je op de juiste plek! Het verwarde mij ook een tijdje. Als je bent zoals ik, is dit iets dat je niet “zomaar” kunt accepteren. Ik zou kunnen aanvaarden dat als de gegevens er zijn, je er een of andere manipulatie op zou kunnen uitvoeren om req.body
te krijgen. Ik hoef niet precies te begrijpen wat die manipulaties zijn. Maar als de gegevens er niet eens zijn, hoe kun je dan in godsnaam die manipulaties uitvoeren en req.body
krijgen?!
Laat me het je zien.
Het korte antwoord is dat het ongeveer zo werkt:
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();
});
});
Het lange antwoord is dat je streams moet begrijpen. Om streams te begrijpen, moet je begrijpen dat informatie over het internet wordt verzonden via packets.
Ik neem aan dat je een stukje van de video hebt bekeken en een idee hebt hoe packets werken. De volgende stap is het begrijpen van de stream-abstractie waarmee u in Node zult werken.
Het idee met streams is dat u iets als dit zou kunnen doen:
req.on('data', function(chunk) {
// here's the chunk
});
Telkens wanneer een brok van de gegevens binnenkomt, mag u het gebruiken. Dus de string
abcdefghijklmnopqrstuvwxyz
kan in 5 brokken binnenkomen
abcde
fghij
klmno
pqrst
uvwxyz
en je zou in staat zijn om toegang te krijgen tot elke brok.
Volgens mij, als je toegang wilt tot de post data, moet je het uit de stream halen. Het zal niet alleen beschikbaar zijn op het req
object.
Kijk naar https://www.github.com/substack/stream-adventure voor een beter begrip van hoe streams werken.