Hvordan bodyParser() virker
Under the Hood
Ok Adam, nok med det pjat. Jeg forstår, hvordan middlware fungerer. Men når jeg ikke bruger bodyParser, og jeg logger ud af
req
objektet, får jeg bare denne enorme ting og kan ikke finde mine data nogen steder. Jeg forstår hvordan en middlware kan gøre noget somreq.body = constructBody(req.data)
, men jeg kan ikke findereq.data
!!!
Hvis du stiller det spørgsmål, er du kommet til det rigtige sted! Det forvirrede mig også i et stykke tid. Hvis du er som mig, er det den slags ting, som du ikke “bare kan acceptere”. Jeg kunne acceptere, at hvis dataene er der, kunne man udføre en eller anden form for manipulationer på dem for at få req.body
. Jeg behøver ikke at forstå præcis, hvad disse manipulationer er. Men hvis dataene ikke engang er der, hvordan fanden kan du så udføre manipulationerne og få req.body
?!!!
Lad mig vise dig det.
Det korte svar er, at det fungerer nogenlunde sådan her:
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 lange svar er, at du er nødt til at forstå streams. For at forstå streams skal du forstå, at information sendes over internettet via pakker.
Jeg går ud fra, at du har set en del af videoen og har en idé om, hvordan pakker fungerer. Det næste skridt er at forstå stream-abstraktionen, som du vil arbejde med i Node.
Tanken med streams er, at du kan gøre noget i stil med dette:
req.on('data', function(chunk) {
// here's the chunk
});
Hver gang der kommer et stykke data ind, får du lov til at bruge det. Så strengen
abcdefghijklmnopqrstuvwxyz
Måtte komme i 5 chunks
abcde
fghij
klmno
pqrst
uvwxyz
og du ville kunne få adgang til hvert enkelt chunk.
Så vidt jeg har forstået, skal du hente postdataene fra streamet, hvis du vil have adgang til dem. Dvs. det vil ikke bare være tilgængeligt på req
-objektet.
Kig på https://www.github.com/substack/stream-adventure for at få en bedre forståelse af, hvordan streams fungerer.