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?
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 .
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.
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.
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.
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();
})
É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
app.use(express.bodyParser());
Ensuite, pour la demande app.post
, vous pouvez obtenir des valeurs de publication via req.body.{post request variable}
.
Le middleware des éléments suivants est supprimé d’Express.
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);
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
});
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.
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
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!
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;
});
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));
})
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');
});
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');
}
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'
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");
})