912 votes

Comment accéder aux champs du formulaire POST

Voici mon formulaire simple :

<form id="loginformA" action="userlogin" method="post">
    <div>
        <label for="email">Email: </label>
        <input type="text" id="email" name="email"></input>
    </div>
<input type="submit" value="Submit"></input>
</form>

Voici mon Express.js /Node.js code :

app.post('/userlogin', function(sReq, sRes){    
    var email = sReq.query.email.;   
}

J'ai essayé sReq.query.email o sReq.query['email'] o sReq.params['email'] etc. Aucun d'entre eux ne fonctionne. Elles renvoient toutes undefined .

Lorsque je passe à un appel Get, cela fonctionne, donc une idée ?

41 votes

SÉCURITÉ : tout le monde utilise bodyParser() à partir des réponses ici devraient également lire Réponse de @SeanLynch ci-dessous

0 votes

Utilisez le analyseur de corps module. Voici quelques Exemples d'utilisation de body-parser

1397voto

Drew Noakes Points 69288

Les choses ont modifié en commençant une fois de plus Express 4.16.0 vous pouvez maintenant utiliser express.json() y express.urlencoded() comme dans Express 3.0 .

C'était différents démarrage Express 4.0 à 4.15 :

$ npm install --save body-parser

et ensuite :

var bodyParser = require('body-parser')
app.use( bodyParser.json() );       // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({     // to support URL-encoded bodies
  extended: true
})); 

Le reste est comme dans Express 3.0 :

Tout d'abord, vous devez ajouter un intergiciel pour analyser les données post du corps.

Ajoutez l'une ou les deux lignes de code suivantes :

app.use(express.json());       // to support JSON-encoded bodies
app.use(express.urlencoded()); // to support URL-encoded bodies

Ensuite, dans votre gestionnaire, utilisez la fonction req.body objet :

// assuming POST: name=foo&color=red            <-- URL encoding
//
// or       POST: {"name":"foo","color":"red"}  <-- JSON encoding

app.post('/test-page', function(req, res) {
    var name = req.body.name,
        color = req.body.color;
    // ...
});

Notez que l'utilisation de express.bodyParser() n'est pas recommandé.

app.use(express.bodyParser());

...est équivalent à :

app.use(express.json());
app.use(express.urlencoded());
app.use(express.multipart());

Des problèmes de sécurité existent avec express.multipart() Il est donc préférable d'ajouter explicitement la prise en charge du ou des types d'encodage spécifiques dont vous avez besoin. Si vous avez besoin d'un encodage multipart (pour supporter le téléchargement de fichiers par exemple), vous devez alors lisez ceci .

86 votes

Si cette réponse ne fonctionne pas correctement, assurez-vous que vous avez le fichier content-type l'ensemble d'en-têtes, par exemple : curl -d '{"good_food":["pizza"]}' -H 'content-type:application/json' "http://www.example.com/your_endpoint"

6 votes

Quelle est la différence entre l'affichage d'un formulaire avec des paires nom/valeur et l'affichage d'un corps JSON ? Les deux apparaissent-ils dans req.body ?

8 votes

@chovy Oui, ils le font. bodyParser permet d'abstraire les données JSON, encodées par URL et multipartites dans l'interface de l'utilisateur. req.body objet.

107voto

Sean Lynch Points 1890

Problème de sécurité avec express.bodyParser()

Alors que toutes les autres réponses recommandent actuellement d'utiliser le express.bodyParser() il s'agit en fait d'une enveloppe autour de l'application express.json() , express.urlencoded() y express.multipart() les intergiciels ( http://expressjs.com/api.html#bodyParser ). L'analyse des corps de demande de formulaire est effectuée par la fonction express.urlencoded() et c'est tout ce dont vous avez besoin pour exposer les données de votre formulaire à l'Internet. req.body objet.

En raison d'un problème de sécurité avec comment express.multipart() / connect.multipart() crée des fichiers temporaires pour tous les fichiers téléchargés (et ne font pas l'objet d'un ramassage). recommandé de ne pas utiliser le express.bodyParser() mais n'utilisez que les logiciels intermédiaires dont vous avez besoin.

Note : connect.bodyParser() sera bientôt mis à jour pour n'inclure que urlencoded y json lorsque Connect 3.0 sera publié (qui prolonge Express).


Donc, en résumé, au lieu de ...

app.use(express.bodyParser());

...vous devriez utiliser

app.use(express.urlencoded());
app.use(express.json());      // if needed

et si/quand vous devez gérer des formulaires multipartites (téléchargements de fichiers), utilisez une bibliothèque ou un intergiciel tiers tel que multiparty, busboy, dicer, etc.

0 votes

Ajoutez un commentaire sous la question pour que plus de personnes voient vos préoccupations et vos conseils. D'autres solutions détaillées dans Article du blog d'Andrew Kelley (encore) pertinent à votre avis ? (je demande juste pour les autres, mes besoins sont purement pour des outils internes ^^)

0 votes

@FelipeAls - Oui, et je voulais également faire référence au message d'Andrew. Toutes ces suggestions (en tenant compte des inconvénients de chacune) sont pertinentes.

0 votes

De plus, une fois que Connect 3.0 sera publié sans inclure multipart() dans le cadre de bodyParser() , bodyParser() redevient "sûr", mais vous devrez activer explicitement le support multipart en utilisant une bibliothèque tierce.

88voto

yonran Points 6952

Note Cette réponse concerne l'Express 2. Voir aquí pour Express 3.

Si vous utilisez connect/express, vous devez utiliser l'option intergiciel bodyParser : C'est décrit dans le Guide Expressjs .

// example using express.js:
var express = require('express')
  , app = express.createServer();
app.use(express.bodyParser());
app.post('/', function(req, res){
  var email = req.param('email', null);  // second parameter is default
});

Voici la version originale en connexion seule :

// example using just connect
var connect = require('connect');
var url = require('url');
var qs = require('qs');
var server = connect(
  connect.bodyParser(),
  connect.router(function(app) {
    app.post('/userlogin', function(req, res) {
      // the bodyParser puts the parsed request in req.body.
      var parsedUrl = qs.parse(url.parse(req.url).query);
      var email = parsedUrl.email || req.body.email;;
    });
  })
);

La chaîne de requête et le corps sont analysés à l'aide de la fonction Gestion des paramètres à la manière de Rails ( qs ) plutôt que le de bas niveau querystring bibliothèque . Afin d'analyser les paramètres répétés avec qs le paramètre doit avoir des parenthèses : name[]=val1&name[]=val2 . Il supporte également les cartes imbriquées. En plus d'analyser les soumissions de formulaires HTML, le bodyParser peut analyser automatiquement les requêtes JSON.

Modifier : Je me suis renseigné sur express.js et j'ai modifié ma réponse pour qu'elle soit plus naturelle pour les utilisateurs d'Express.

0 votes

Hmm ok. J'ai essayé le bodyParser(). La doc dit que je peux l'obtenir à partir de req.query() mais je n'ai rien obtenu. c'est très bizarre. Je n'ai aucun problème avec Get tho.

3 votes

Non, req.query ne contient QUE les paramètres GET. Vous obtenez les données POST via req.body. La fonction req.params() les inclut tous les deux.

1 votes

Un clic égaré a rétrogradé cette réponse accidentellement sans que je m'en aperçoive ! Maintenant StackOverflow ne me laisse pas la modifier. C'est d'autant plus frustrant que cette réponse était utile... J'ai upvoted une autre de vos bonnes réponses que je ne cherchais pas explicitement pour me rattraper :)

29voto

mplewis Points 106

Note pour les utilisateurs d'Express 4 :

Si vous essayez de mettre app.use(express.bodyParser()); dans votre application, vous obtiendrez l'erreur suivante lorsque vous tenterez de démarrer votre serveur Express :

Erreur : La plupart des intergiciels (comme bodyParser) ne sont plus fournis avec Express et doivent être installés séparément. Veuillez consulter https://github.com/senchalabs/connect#middleware .

Vous devrez installer le paquet body-parser séparément à partir de npm puis utilisez quelque chose comme ce qui suit (exemple tiré de la page GitHub ):

var express    = require('express');
var bodyParser = require('body-parser');

var app = express();

app.use(bodyParser());

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next();
})

0 votes

Merci beaucoup pour ces informations. Je m'arrachais les cheveux à essayer de gérer la nouvelle façon d'utiliser bodyParser ! C'est une grande avancée - j'apprécie vraiment.

1 votes

Heplp : body-parser deprecated bodyParser : utiliser des intermédiaires individuels json/urlencoded

24voto

David Points 321

Sous une certaine forme :

<form action='/somepath' method='post'>
   <input type='text' name='name'></input>
</form>

Utilisation de l'express

app.post('/somepath', function(req, res) {

    console.log(JSON.stringify(req.body));

    console.log('req.body.name', req.body['name']);
});

Sortie :

{"name":"x","description":"x"}
req.param.name x

6 votes

Cela n'a pas fonctionné pour moi. Il faut utiliser app.use(express.bodyParser()) ;

0 votes

@cawecoy absolument exact même chose ici mais express.bodyParser() ne fonctionne pas aussi bien pour moi il est déprécié.

0 votes

@MohammadFaizankhan c'était un travail expérimental, je n'ai plus utilisé express, je ne peux pas aider maintenant. Cherchez sur Google des fonctions similaires à express.bodyParser(). Bonne chance !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X