Que fait l'analyseur corporel avec express?


339

Je ne comprends pas pourquoi nous avons besoin body-parserd'une application Express, car nous pouvons obtenir des données sans utiliser body-parser. Et que fait-il réellement et comment?


54
pour lire les données HTTP POST, nous devons utiliser le module de nœud "body-parser". body-parser est un middleware express qui lit l'entrée d'un formulaire et le stocke en tant qu'objet javascript accessible viareq.body
refactor

2
Avec express, vous pouvez lire toutes les données à l'intérieur de la demande HTTP, telles que les en-têtes req.headers(tableau), vous pouvez lire le corps du paquet http comme req.bodyexpliqué par @CleanCrispCode et vous pouvez lire comme paramètre de requête req.query.variable, cela aide car express transforme automatiquement la demande en javascript objets
Fernando Zamperin

3
@refactor - cela pourrait être l' une des nombreuses raisons pour lesquelles nous devons utiliser l' analyseur de corps, mais il ne dit pas ce qu'il fait, c'est-à-dire que les objets de requête et de réponse HTTP sont des flux et qu'ils ne sont pas «lisibles» en tant qu'objet unique comme res.bodysans que le flux entier soit tamponné en res.bodypremier.
ortonomie

1
Avec Express version 4.16+, ils ont inclus leur propre version de l'analyseur de corps intégré afin que vous n'ayez pas à tirer dans ce package.
StefanBob

Réponses:


255

Pour gérer la HTTP POSTdemande dans Express.js version 4 et supérieure, vous devez installer le module middleware appelé body-parser.

body-parserextraire la totalité du corps d'un flux de demandes entrantes et l'expose req.body.

Le middleware faisait partie d'Express.js auparavant, mais maintenant vous devez l'installer séparément.

Ce body-parsermodule analyse les données codées JSON, tampon, chaîne et URL soumises à l'aide de la HTTP POSTdemande. Installez à l' body-parseraide de NPM comme indiqué ci-dessous.

npm install body-parser --save

modifier en 2019-avril-2: dans express@4.16.0 le middleware body-parser fourni avec express. pour plus de détails voir ceci


126
C'est très probablement la chose la plus obscure jamais. Pourquoi les développeurs Core Express rendraient-ils incroyablement difficile l'intégration des nouveaux arrivants en leur faisant installer des middlewares supplémentaires pour les cas d'utilisation les plus courants dans le développement Web?
elmt

5
@elmt si vous voulez quelque chose avec des opinions, essayez sails.js
George

1
@ user1063287 oui c'est le cas. urlencoded()et json()sont en fait des usines de middleware qui renvoient une fonction de middleware qui invoquenext()
Nick Manning

3
Ce n'est pas boiteux @elmt, le nœud n'est pas seulement pour le web, il peut être utilisé sur un ordinateur de bureau, mobile, etc., et dans ces cas, ce n'est pas un module requis. Le nœud peut s'adapter à votre application sans aucune responsabilité
fnaquira

28
@fnaquira - Vous êtes confus. Il s'agit d'exprimer pas de nœud.
elmt

85

Oui, nous pouvons travailler sans body-parser. Lorsque vous ne l'utilisez pas, vous obtenez la demande brute, et votre corps et vos en-têtes ne sont pas dans l'objet racine du paramètre de demande. Vous devrez manipuler individuellement tous les champs.

Ou vous pouvez l'utiliser body-parser, car l'équipe express le maintient.

Ce que l'analyseur corporel peut faire pour vous: il simplifie la demande.
Comment l'utiliser: Voici un exemple:

Installer npm install body-parser --save

Voici comment utiliser l'analyseur de corps en express:

const express = require('express'),
      app = express(),
      bodyParser = require('body-parser');

// support parsing of application/json type post data
app.use(bodyParser.json());

//support parsing of application/x-www-form-urlencoded post data
app.use(bodyParser.urlencoded({ extended: true }));

Lien.

https://github.com/expressjs/body-parser .

Et puis vous pouvez obtenir le corps et les en-têtes dans l'objet de demande racine. Exemple

app.post("/posturl",function(req,res,next){
    console.log(req.body);
    res.send("response");
})

3
Hé merci pour l'info, pouvez-vous publier un exemple de code sans analyseur de corps?
Ilyas karim

55

La réponse ici l' explique de façon très détaillée et brillante, la réponse contient:

En bref; body-parser extrait la totalité du corps d'un flux de requêtes entrantes et l'expose req.bodycomme quelque chose de plus facile à interfacer. Vous n'en avez pas besoin en soi, car vous pouvez faire tout cela vous-même. Cependant, il fera probablement ce que vous voulez et vous évitera des ennuis.


Pour aller un peu plus en profondeur; body-parser vous donne un middleware qui utilise nodejs / zlib pour décompresser les données de la requête entrante si elles sont zippées et stream-utils / raw-body pour attendre le contenu brut complet du corps de la requête avant de "l'analyser" (cela signifie que si vous n'alliez pas utiliser le corps de la requête, vous avez juste perdu du temps).

Après avoir le contenu brut, body-parser le analysera en utilisant l'une des quatre stratégies, en fonction du middleware spécifique que vous avez décidé d'utiliser:

  • bodyParser.raw () : Ne fait analyser le corps, mais expose tout le contenu tamponnés de devant dans un tampon sur req.body.

  • bodyParser.text () : lit le tampon en texte brut et expose la chaîne résultante sur req.body.

  • bodyParser.urlencoded () : analyse le texte en tant que données encodées par URL (c'est ainsi que les navigateurs ont tendance à envoyer des données de formulaire à partir de formulaires normaux définis sur POST) et expose l'objet résultant (contenant les clés et les valeurs) req.body. En comparaison; en PHP, tout cela est automatiquement fait et exposé dans $_POST.

  • bodyParser.json () : analyse le texte en JSON et expose l'objet résultant req.body.

Ce n'est qu'après avoir défini le req.bodycontenu souhaité qu'il appellera le prochain middleware de la pile, qui pourra alors accéder aux données de la demande sans avoir à réfléchir à la façon de le décompresser et de l'analyser.

Vous pouvez vous référer à github body-parser pour lire leur documentation, il contient des informations concernant son fonctionnement.


47

Essayons de garder cela le moins technique.

Supposons que vous envoyez des données de formulaire html au serveur node-js, c'est-à-dire que vous avez fait une demande au serveur. Le fichier serveur recevrait votre demande sous un objet de demande. Maintenant, par logique, si vous consignez cet objet de requête dans votre fichier serveur, vous devriez voir vos données de formulaire quelque part, qui pourraient être extraites ensuite, mais whoa! vous ne le faites pas vraiment!

Alors, où sont nos données? Comment allons-nous l'extraire si ce n'est pas seulement présent dans ma demande.

Une explication simple à cela est que http envoie vos données de formulaire en morceaux qui sont destinés à être assemblés lorsqu'ils atteignent leur destination. Alors, comment voulez-vous extraire vos données.

Mais, pourquoi prendre cette peine de toujours analyser manuellement vos données pour les morceaux et les assembler. Utilisez quelque chose appelé «analyseur corporel» qui ferait cela pour vous.

body-parser analyse votre demande et la convertit en un format à partir duquel vous pouvez facilement extraire les informations pertinentes dont vous pourriez avoir besoin.

Par exemple, supposons que vous ayez un formulaire d'inscription à votre frontend. Vous le remplissez et demandez au serveur de sauvegarder les détails quelque part.

Extraire le nom d'utilisateur et le mot de passe de votre demande est aussi simple que ci-dessous si vous utilisez l'analyseur corporel.

var loginDetails = {    
    username : request.body.username,    
    password : request.body.password    
};

Donc, fondamentalement, l'analyseur de corps a analysé votre demande entrante, assemblé les morceaux contenant vos données de formulaire, puis créé cet objet corps pour vous et l'a rempli avec vos données de formulaire.


10

Il analyse le corps de la requête HTTP. Cela est généralement nécessaire lorsque vous avez besoin de savoir plus que l'URL que vous frappez, en particulier dans le contexte d'une requête HTTP POST ou PUT PATCH où les informations que vous souhaitez contenir sont contenues dans le corps.

Fondamentalement, c'est un middleware pour analyser JSON, du texte brut ou simplement renvoyer un objet Buffer brut pour que vous puissiez le traiter selon vos besoins.


8

Afin d'avoir accès aux données postales que nous devons utiliser body-parser. Fondamentalement, qu'est-ce body-parserqui permet à express de lire le corps, puis de l'analyser en un Jsonobjet que nous pouvons comprendre.


7

Ce sont toutes des questions de commodité.

Fondamentalement, si la question était "Avons-nous besoin d'utiliser body-parser?" La réponse est non'. Nous pouvons trouver les mêmes informations à partir du client après la demande en utilisant un itinéraire plus détourné qui sera généralement moins flexible et augmentera la quantité de code que nous devons écrire pour obtenir les mêmes informations.

C'est un peu la même chose que de demander "Avons-nous besoin d'utiliser expresspour commencer?" Encore une fois, la réponse est non, et encore une fois, tout se résume à nous épargner les tracas de l'écriture de plus de code pour faire les choses de base qui expriment est livré avec «intégré».

En surface - body-parserfacilite l'accès aux informations contenues dans les demandes des clients dans une variété de formats au lieu de vous faire capturer les flux de données brutes et de déterminer le format des informations, et encore moins d'analyser manuellement ces informations en données utilisables.


6

Comprendre le corps des demandes

Lors de la réception d'une demande POST ou PUT, le corps de la demande peut être important pour votre application. Accéder aux données du corps est un peu plus compliqué que d'accéder aux en-têtes de demande. L'objet de demande transmis à un gestionnaire implémente l'interface ReadableStream. Ce flux peut être écouté ou canalisé ailleurs comme tout autre flux. Nous pouvons extraire les données directement du flux en écoutant les événements «données» et «fin» du flux.

Le bloc émis dans chaque événement «data» est un tampon. Si vous savez que ce seront des données de chaîne, la meilleure chose à faire est de collecter les données dans un tableau, puis à la «fin», de les concaténer et de les stringifier.

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // at this point, `body` has the entire request body stored in it as a string
});

Comprendre l'analyseur corporel

Selon sa documentation

Analysez les corps de requêtes entrants dans un middleware avant vos gestionnaires, disponibles sous la propriété req.body.

Comme vous l'avez vu dans le premier exemple, nous avons dû analyser manuellement le flux de demandes entrantes pour extraire le corps. Cela devient un peu fastidieux lorsqu'il existe plusieurs données de formulaire de différents types. Nous utilisons donc le package body-parser qui fait toutes ces tâches sous le capot.

Il fournit quatre modules pour analyser différents types de données

Après avoir le parseur de contenu brut, vous utiliserez l'une des stratégies ci-dessus (selon le middleware que vous avez décidé d'utiliser) pour analyser les données. Vous pouvez en savoir plus sur eux en lisant leur documentation.

Après avoir défini le req.bodysur le corps analysé, l'analyseur de corps invoquera next()pour appeler le prochain middleware dans la pile, qui pourra alors accéder aux données de la demande sans avoir à réfléchir à la façon de le décompresser et de l'analyser.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.