Comment fonctionne bodyParser()
Under the Hood
Ok Adam, assez avec les BS. Je comprends comment le middlware fonctionne. Mais quand je n’utilise pas bodyParser et que je déconnecte l’objet
req
, j’ai juste cette énorme chose et je ne peux trouver mes données nulle part. Je comprends comment un middlware pourrait faire quelque chose commereq.body = constructBody(req.data)
, mais je ne peux pas trouverreq.data
!
Si vous vous posez cette question, vous êtes au bon endroit ! Cela m’a confondu pendant un certain temps aussi. Si vous êtes comme moi, c’est le genre de chose que vous ne pouvez pas « juste accepter ». Je pourrais accepter que si les données sont là, vous pourriez effectuer une sorte de manipulation sur elles pour obtenir req.body
. Je n’ai pas besoin de comprendre exactement quelles sont ces manipulations. Mais si les données ne sont même pas là, comment diable pouvez-vous effectuer les manipulations et obtenir req.body
?!
Laissez-moi vous montrer.
La réponse courte est que cela fonctionne à peu près comme ceci:
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();
});
});
La réponse longue est que vous devez comprendre les flux. Pour comprendre les flux, vous devez comprendre que les informations sont envoyées sur Internet via des paquets.
Je suppose que vous avez regardé un peu la vidéo et que vous avez une idée du fonctionnement des paquets. La prochaine étape consiste à comprendre l’abstraction des flux avec laquelle vous travaillerez dans Node.
L’idée avec les flux est que vous pourriez faire quelque chose comme ceci :
req.on('data', function(chunk) {
// here's the chunk
});
Chaque fois qu’un morceau de données arrive, vous pouvez l’utiliser. Ainsi, la chaîne
abcdefghijklmnopqrstuvwxyz
pourrait arriver en 5 morceaux
abcde
fghij
klmno
pqrst
uvwxyz
et vous seriez en mesure d’accéder à chaque morceau.
Si je comprends bien, si vous voulez accéder aux données du post, vous devez les obtenir à partir du flux. Ie. il ne sera pas simplement disponible sur l’objet req
.
Voyez https://www.github.com/substack/stream-adventurepour mieux comprendre le fonctionnement des flux.