Hur bodyParser() fungerar

Under the Hood

Ok Adam, nog med skitsnack. Jag förstår hur middlware fungerar. Men när jag inte använder bodyParser och loggar ut req objektet får jag bara den här enorma saken och kan inte hitta mina data någonstans. Jag förstår hur en middlware kan göra något som req.body = constructBody(req.data), men jag kan inte hitta req.data!!

Om du ställer den frågan har du kommit till rätt ställe! Det förvirrade mig också ett tag. Om du är som jag kan du inte ”bara acceptera” den här typen av saker. Jag skulle kunna acceptera att om uppgifterna finns där kan man utföra någon form av manipulationer på dem för att få fram req.body. Jag behöver inte förstå exakt vilka dessa manipulationer är. Men om data inte ens finns där, hur i helvete kan du utföra manipulationerna och få req.body?!!!

Låt mig visa dig.

Det korta svaret är att det fungerar ungefär så här:

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();
});
});

Det långa svaret är att du måste förstå strömmar. För att förstå strömmar måste du förstå att information skickas över internet via paket.

Jag antar att du tittade lite på videon och har en uppfattning om hur paket fungerar. Nästa steg är att förstå abstraktionen stream som du kommer att arbeta med i Node.

Tanken med streams är att du kan göra ungefär så här:

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

Varje gång en bit data kommer in får du använda den. Så strängen

abcdefghijklmnopqrstuvwxyz

kan komma i 5 stycken

abcde
fghij
klmno
pqrst
uvwxyz

och du skulle kunna få tillgång till varje stycke.

Såvitt jag förstår måste du hämta postdata från strömmen om du vill få tillgång till dem. Dvs. den kommer inte bara att vara tillgänglig på req-objektet.

Kolla på https://www.github.com/substack/stream-adventure för att få en bättre förståelse för hur strömmar fungerar.

Lämna ett svar

Din e-postadress kommer inte publiceras.