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 como req.body = constructBody(req.data), mas não consigo encontrar req.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.

Deixe uma resposta

O seu endereço de email não será publicado.