Je ne comprends pas pourquoi nous avons besoin de body-parser
dans une application Express, car nous pouvons obtenir des données sans utiliser body-parser
. Et que fait-il réellement et comment?
Pour traiter la demande HTTP POST
dans Express.js version 4 et ultérieure, vous devez installer un module de middleware appelé body-parser
.
body-parser
extrait la totalité du corps d'un flux de demandes entrant et l'expose à req.body
.
Le middleware faisait partie de Express.js auparavant, mais vous devez maintenant l'installer séparément.
Ce module body-parser
analyse les données codées JSON, tampon, chaîne et URL soumises à l'aide de la demande HTTP POST
. Installez body-parser
en utilisant NPM comme indiqué ci-dessous.
npm install body-parser --save
éditez en 2019-avril-2: dans [email protected], le middleware d'analyse syntaxique du corps fourni avec express. pour plus de détails voir ceci
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 figurent pas dans le paramètre objet racine de la demande. Vous devrez manipuler individuellement tous les champs.
Ou vous pouvez utiliser body-parser
, car l'équipe express le maintient.
Ce que l'analyseur de corps peut faire pour vous: Cela simplifie la demande.
Comment l'utiliser: Voici un exemple:
Installer npm install body-parser --save
Voici comment utiliser body-parser dans 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 vous pouvez alors obtenir le corps et les en-têtes dans l'objet de requête racine. Exemple
app.post("/posturl",function(req,res,next){
console.log(req.body);
res.send("response");
})
La réponse ici l'explique de manière très détaillée et brillamment, la réponse contient:
En bref; analyseur de corps extrait la totalité du corps d'un flux de demandes entrantes et l'expose sur
req.body
comme une interface plus facile à utiliser. Vous n'en avez pas besoin en tant que tel, car vous pouvez faire tout cela vous-même. Cependant, il fera très 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 compressées et stream-utils/raw-body pour attendre le contenu brut complet du corps de la demande avant de "l'analyser" (cela signifie que si vous n'utilisiez pas le corps de la demande, vous perdiez simplement du temps).
Après avoir eu 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 () : N'analyse pas réellement le corps, mais expose simplement le contenu précédemment mis en mémoire tampon dans un Buffer sur
req.body
.bodyParser.text () : Lit le tampon sous forme de texte brut et expose la chaîne résultante sur req.body.
bodyParser.urlencoded () : Analyse le texte en tant que données codées en URL (méthode utilisée par les navigateurs pour envoyer des données de formulaire à partir de formulaires standard définis sur POST) et expose l'objet obtenu (contenant les clés et les valeurs) sur
req.body
. En comparaison; dans PHP tout cela est automatiquement fait et exposé dans$_POST
.bodyParser.json () : Analyse le texte en tant que JSON et expose l'objet obtenu sur
req.body
.Ce n'est qu'après avoir défini le
req.body
sur le contenu 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 le parser.
Vous pouvez vous référer à analyseur de corps github pour lire leur documentation, elle contient des informations sur son fonctionnement.
Essayons de garder le moins technique possible.
Supposons que vous envoyez des données de formulaire html au serveur node-js, c’est-à-dire que vous avez demandé au serveur. Le fichier du serveur recevrait votre demande sous un objet de demande. Maintenant, logiquement, si vous enregistrez dans la console cet objet de requête dans votre fichier de serveur, vous devriez voir vos données de formulaire à un endroit où elles se trouvent, ce qui pourrait être extrait à ce moment-là, mais whoa! tu ne le fais pas!
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 destinés à être assemblés à leur arrivée à destination. Alors, comment voulez-vous extraire vos données.
Mais pourquoi prendre cette douleur à chaque fois que vous analysez manuellement vos données pour les assembler et les assembler. Utilisez quelque chose appelé "analyseur de corps" qui ferait cela pour vous.
body-parser analyse votre demande et la convertit dans un format permettant d'extraire facilement les informations pertinentes dont vous pourriez avoir besoin.
Par exemple, supposons que vous ayez un formulaire d’inscription à votre interface. 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 requête s’effectue aussi simplement que ci-dessous si vous utilisez body-parser.
var loginDetails = {
username : request.body.username,
password : request.body.password
};
Donc, fondamentalement, l’analyseur de corps a analysé votre demande entrante, a assemblé les morceaux contenant vos données de formulaire, puis créé cet objet de corps pour vous et l’a rempli avec vos données de formulaire.
Il analyse le corps de la requête HTTP. Cela est généralement nécessaire lorsque vous avez besoin de connaître davantage que l'URL que vous avez tapée, en particulier dans le contexte d'une requête HTTP POST ou PUT PATCH où les informations souhaitées sont contenues dans le corps.
Il s’agit essentiellement d’un middleware pour l’analyse de JSON, du texte brut ou le renvoi d’un objet brut Buffer que vous pouvez traiter selon vos besoins.
Ce sont toutes des questions de commodité.
Fondamentalement, si la question était "Est-ce que nous nécessité d'utiliser body-parser
?" La réponse est non'. Nous pouvons obtenir les mêmes informations à partir de la requête postérieure du client en utilisant une route plus détournée, 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 "Est-ce que nous besoin d’utiliser express
pour commencer? Encore une fois, la réponse est non, et encore une fois, tout cela revient réellement à nous épargner le temps nécessaire pour écrire plus de code afin de faire les choses de base qui sont livrées avec "intégré".
À la surface - body-parser
facilite l'obtention de l'information contenue dans les demandes des clients dans divers formats au lieu de vous permettre de capturer les flux de données brutes et de déterminer le format de l'information, et encore moins d'analyser manuellement informations en données utilisables.
Pour avoir accès aux données de poste, nous devons utiliser body-parser
. Fondamentalement, quel est le body-parser
qui permet à Express de lire le corps, puis de l'analyser dans un objet Json
que nous pouvons comprendre.
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 complexe que d'accéder aux en-têtes de requête. L'objet de requête transmis à un gestionnaire implémente l'interface ReadableStream. Ce flux peut être écouté ou diffusé ailleurs, comme n'importe quel autre flux. Nous pouvons récupérer les données directement dans le flux en écoutant les événements 'data' et 'end' du flux.
Le bloc émis dans chaque événement 'data' est un tampon. Si vous savez qu'il s'agira de données sous forme 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 le corps-analyseur
Selon sa documentation
Analyser les corps des demandes entrantes dans un middleware avant vos gestionnaires, disponible dans 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 types de données de formulaire. Nous utilisons donc le package body-parser qui effectue toute cette tâche sous le capot.
Il fournit quatre modules pour analyser différents types de données
Après avoir analysé le contenu brut, l’analyseur de corps utilisera l’une des stratégies ci-dessus (en fonction du 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.body
sur le corps analysé, body-parser invoquera next()
pour appeler le prochain logiciel intermédiaire en bas de la pile, qui pourra alors accéder aux données de la requête sans avoir à réfléchir à la manière de le décompresser et de l'analyser. .