Como funciona o BodyParser()
Baixo da Capota
Ok Adam, basta com o BS. Eu entendo como funciona o Middlware. Mas quando eu não uso o bodyParser e faço o logout do objeto
req
, eu simplesmente pego essa coisa enorme e não consigo encontrar meus dados em lugar algum. Eu entendo como um middlware poderia fazer algo comoreq.body = constructBody(req.data)
, mas não consigo encontrarreq.data
!!
Se você está fazendo essa pergunta, você veio ao lugar certo! Isso também me confundiu por um tempo. Se você é como eu, este é o tipo de coisa que você não pode “simplesmente aceitar”. Eu poderia aceitar que se os dados estiverem lá, você poderia fazer algum tipo de manipulação para conseguir req.body
. Eu não tenho que entender exatamente o que são essas manipulações. Mas se os dados nem sequer estão lá, como diabos você pode executar as manipulações e obter req.body
?!!
Deixe-me mostrar-lhe.
A resposta curta é que funciona algo assim:
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();
});
});
A resposta longa é que você tem que entender os fluxos. Para entender os streams, você tem que entender que a informação é enviada pela internet através de pacotes.
Presumo que você assistiu um pouco do vídeo e tem uma idéia de como os pacotes funcionam. O próximo passo é entender a abstração do stream com que você vai trabalhar no Node.
A idéia com streams é que você poderia fazer algo assim:
req.on('data', function(chunk) {
// here's the chunk
});
A cada vez que um pedaço dos dados chega, você pode usá-lo. Então a string
abcdefghijklmnopqrstuvwxyz
Pode vir em 5 pedaços
abcde
fghij
klmno
pqrst
uvwxyz
e você seria capaz de acessar cada pedaço.
Ao meu entender, se você quiser acessar os dados do post, você tem que obtê-los a partir do stream. Ie. ele não estará disponível apenas no objeto.req
Check out https://www.github.com/substack/stream-adventure para entender melhor como funcionam os streams.