web-dev-qa-db-fra.com

Comment récupérer POST paramètres de requête?

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 / code Node.js:

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

J'ai essayé sReq.query.email ou sReq.query['email'] ou sReq.params['email'], etc. Aucun d'entre eux ne fonctionne. Ils retournent tous undefined

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

694
murvinlai

Les choses ont ont changé encore une fois en démarrant Express 4.16.0, vous pouvez maintenant utiliser express.json() et express.urlencoded() comme dans Express 3.0.

C'était différent commençant Express 4.0 à 4.15:

$ npm install --save body-parser

et alors:

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 middleware pour analyser les données de publication du corps.

Ajoutez 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 le req.body object:

// 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ée.

app.use(express.bodyParser());

...est équivalent à:

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

La fonction express.multipart() pose un problème de sécurité. Il est donc préférable d’ajouter explicitement un support pour le (s) type (s) de codage spécifique requis. Si vous avez besoin d'un codage en plusieurs parties (pour prendre en charge le téléchargement de fichiers, par exemple), vous devriez lire ceci .

1122
Drew Noakes

Note: cette réponse concerne Express 2. Voir ici pour Express 3.

Si vous utilisez connect/express, vous devez utiliser le middleware bodyParser : Il 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 connect-only:

// 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 tous deux analysés à l'aide de traitement des paramètres de style Rails (qs) plutôt que de la bibliothèque de bas niveau querystring . Pour analyser les paramètres répétés avec qs, le paramètre doit avoir des crochets: name[]=val1&name[]=val2. Il prend également en charge les cartes imbriquées. En plus de l'analyse des soumissions de formulaire HTML, bodyParser peut analyser automatiquement les requêtes JSON.

Edit: J'ai lu sur express.js et modifié ma réponse pour qu'elle soit plus naturelle pour les utilisateurs d'Express.

80
yonran

Problème de sécurité lors de l'utilisation de express.bodyParser ()

Alors que toutes les autres réponses recommandent actuellement d'utiliser le middleware express.bodyParser(), il s'agit en fait d'un wrapper autour des middlewares express.json(), express.urlencoded() et express.multipart() ( http://expressjs.com/api.html#bodyParser ). L'analyse du corps des demandes de formulaire est effectuée par le middleware express.urlencoded() et constitue tout ce dont vous avez besoin pour exposer vos données de formulaire sur l'objet req.body.

En raison d'un problème de sécurité avec la façon dont express.multipart()/connect.multipart() crée des fichiers temporaires pour tous les fichiers téléchargés (et ne sont pas récupérés), il est maintenant RECOMMAND&EACUTE; de ne pas utiliser le express.bodyParser() mais n'utilisez que les middlewares dont vous avez besoin.

Remarque: connect.bodyParser() sera bientôt mis à jour afin d'inclure uniquement urlencoded et json lors de la publication de Connect 3.0 (qu'Express étend).


En bref, au lieu de ...

app.use(express.bodyParser());

...Tu devrais utiliser

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

et si/quand vous devez gérer des formulaires en plusieurs parties (téléchargements de fichiers), utilisez une bibliothèque tierce ou un middleware tel que multipartie, busboy, dicer, etc.

79
Sean Lynch

Cela le fera si vous voulez construire la requête publiée sans middleware:

app.post("/register/",function(req,res){
    var bodyStr = '';
    req.on("data",function(chunk){
        bodyStr += chunk.toString();
    });
    req.on("end",function(){
        res.send(bodyStr);
    });

});

Cela enverra ceci au navigateur

email=emailval&password1=pass1val&password2=pass2val

Cependant, il est probablement préférable d'utiliser un middleware pour ne pas avoir à l'écrire à chaque fois.

29
med116

Note pour les utilisateurs d'Express 4:

Si vous essayez de placer app.use(express.bodyParser()); dans votre application, le message d'erreur suivant s'affiche lorsque vous essayez de démarrer votre serveur Express:

Erreur: la plupart des middlewares (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 package body-parser séparément à partir de npm , puis utiliser le suivant (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();
})
23
mplewis

Étant donné une forme: 

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

En utilisant 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
18
David
app.use(express.bodyParser());

Ensuite, pour la demande app.post, vous pouvez obtenir des valeurs de publication via req.body.{post request variable}.

14

Mise à jour pour Express 4.4.1

Le middleware des éléments suivants est supprimé d’Express.

  • bodyParser
  • jSON
  • codé en url
  • en plusieurs parties

Lorsque vous utilisez directement le middleware, comme vous l'avez fait dans Express 3.0. Vous obtiendrez l'erreur suivante:

Error: Most middleware (like urlencoded) is no longer bundled with Express and 
must be installed separately.


Pour utiliser ce middleware, vous devez maintenant faire npm pour chaque middleware séparément.

Puisque bodyParser est marqué comme obsolète, je recommande donc la méthode suivante en utilisant json, urlencode et analyseur multipart comme redoutable, connect-multiparty. (Le middleware multipart est également déconseillé).

Souvenez-vous aussi que si vous définissez simplement urlencode + json, les données du formulaire ne seront pas analysées et req.body ne sera pas défini. Vous devez définir un middleware qui gérera la requête en plusieurs parties.

var urlencode = require('urlencode');
var json = require('json-middleware');
var multipart = require('connect-multiparty');
var multipartMiddleware = multipart();

app.use(json);
app.use(urlencode);
app.use('/url/that/accepts/form-data', multipartMiddleware);
14
yeelan

Backend:

import express from 'express';
import bodyParser from 'body-parser';

const app = express();
app.use(bodyParser.json()); // add a middleware (so that express can parse request.body's json)

app.post('/api/courses', (request, response) => {
  response.json(request.body);
});

L'extrémité avant:

fetch("/api/courses", {
  method: 'POST',
  body: JSON.stringify({ hi: 'hello' }), // stringify JSON
  headers: new Headers({ "Content-Type": "application/json" }); // add headers
});
12
lakesare

Je cherchais ce problème précis. Je suivais tous les conseils ci-dessus mais req.body renvoyait toujours un objet vide {}. Dans mon cas, c'était quelque chose d'aussi simple que le code HTML incorrect. 

Dans le formulaire HTML de votre formulaire, assurez-vous d’utiliser l’attribut 'name' dans vos balises d’entrée, pas seulement 'id'. Sinon, rien n'est analysé.

<input id='foo' type='text' value='1'/>             // req = {}
<input id='foo' type='text' name='foo' value='1' /> // req = {foo:1}

Mon erreur d'idiot est votre avantage.

7
cwingrav

Pour Express 4.1 et supérieur

Comme la plupart des réponses utilisent Express, bodyParser, connect; où multipart est obsolète. Il existe un moyen sécurisé d’envoyer facilement des objets post-multiparties.

Multer peut être utilisé en remplacement de connect.multipart (). 

Pour installer le package

$ npm install multer

Chargez-le dans votre application:

var multer = require('multer');

Et ensuite, ajoutez-le dans la pile de middleware avec l'autre middleware d'analyse de formulaire.

app.use(express.json());
app.use(express.urlencoded());
app.use(multer({ dest: './uploads/' }));

connect.json () handles application/json

connect.urlencoded () gère l'application/x-www-form-urlencoded

multer () gère plusieurs parties/données de formulaire

7
Lalit Umbarkar

Vous ne devriez pas utiliser app.use (express.bodyParser ()) . BodyParser est une union de json + urlencoded + mulitpart. Vous ne devriez pas l'utiliser car plusieurs parties seront supprimées dans connect 3.0.

Pour résoudre cela, vous pouvez faire ceci:

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

Il est très important de savoir que app.use (app.router) devrait être utilisé après le JSON et encodé en url, sinon cela ne fonctionnera pas!

5
HenioJR

La requête en streaming a fonctionné pour moi

req.on('end', function() {
    var paramstring = postdata.split("&");
});

var postdata = "";
req.on('data', function(postdataChunk){
    postdata += postdataChunk;
});
2
zeah

Je pouvais trouver tous les paramètres en utilisant le code suivant pour les deux requêtes POST et GET

 var express = require('express');
    var app = express();
    const util = require('util');  
    app.post('/', function (req, res) {
        console.log("Got a POST request for the homepage");
        res.send(util.inspect(req.query,false,null));
    })

2
ARUNBALAN NV

utiliser le paquet express-fileupload

var app = require('express')();
var http = require('http').Server(app);
const fileUpload = require('express-fileupload')

app.use(fileUpload());

app.post('/', function(req, res) {
var email = req.body.email;
res.send('<h1>Email :</h1> '+email);
});

http.listen(3000, function(){
  console.log('Running Port:3000');
});
0
Chirag
Post Parameters can be retrieved as follows-

app.post('/api/v1/test',Testfunction);
http.createServer(app).listen(port, function(){
console.log("Express server listening on port " + port)
});

function Testfunction(request,response,next)
{
   console.log(request.param("val1"));

   response.send('HI');
}
0
HamidKhan

Vous utilisez 'req.query.post' avec une méthode incorrecte. 'Req.query.post' fonctionne avec 'method = get' 'Method = post' fonctionne avec un analyseur de corps.

Essayez ceci en changeant de poste pour obtenir

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

Et dans le code express, utilisez 'app.get'

0
sagar saini
var express        =         require("express");
var bodyParser     =         require("body-parser");
var app            =         express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get('/',function(req,res){
  res.sendfile("index.html");
});
app.post('/login',function(req,res){
  var user_name=req.body.user;
  var password=req.body.password;
  console.log("User name = "+user_name+", password is "+password);
  res.end("yes");
});
app.listen(3000,function(){
  console.log("Started on PORT 3000");
})
0
seme