Jak funguje bodyParser()

Pod kapotou

Ok, Adame, dost už těch keců. Chápu, jak funguje middlware. Ale když nepoužiju bodyParser a odhlásím objekt req, tak se mi prostě zobrazí obrovská věc a nemůžu nikde najít svá data. Chápu, jak může middlware udělat něco jako req.body = constructBody(req.data), ale nemůžu najít req.data!!!

Pokud se ptáte na tuto otázku, jste na správném místě! Chvíli mě to také mátlo. Pokud jste jako já, je to věc, kterou nemůžete „jen tak přijmout“. Dokázal bych přijmout, že pokud tam ta data jsou, můžete s nimi provést nějakou manipulaci, abyste získali req.body. Nemusím přesně rozumět tomu, jaké to jsou manipulace. Ale pokud tam ta data vůbec nejsou, jak sakra můžeš provést ty manipulace a získat req.body?!!!

Ukážu ti to.

Krátká odpověď je, že to funguje nějak takto:

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

Dlouhá odpověď je, že musíš rozumět proudům. Abyste porozuměli streamům, musíte pochopit, že informace se po internetu posílají prostřednictvím paketů.

Předpokládám, že jste zhlédli kousek videa a máte představu, jak pakety fungují. Dalším krokem je pochopení abstrakce proudů, se kterými budete v Uzlu pracovat.

Podstata proudů spočívá v tom, že byste mohli dělat něco takového:

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

Každý kus dat, který přijde, můžete použít. Takže řetězec

abcdefghijklmnopqrstuvwxyz

Může přijít v 5 kouscích

abcde
fghij
klmno
pqrst
uvwxyz

a ty bys mohl přistupovat ke každému kousku.

Podle mého chápání, pokud chceš přistupovat k datům příspěvku, musíš je získat ze streamu. Tj. nebudou k dispozici jen v objektu req.

Podívejte se na https://www.github.com/substack/stream-adventure, abyste lépe pochopili, jak proudy fungují.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.