557 votes

Express.js req.body non défini

Voici la configuration de mon serveur Express

app.use(app.router); 
app.use(express.cookieParser());
app.use(express.session({ secret: "keyboard cat" }));
app.set('view engine', 'ejs');
app.set("view options", { layout: true });
//Handles post requests
app.use(express.bodyParser());
//Handles put requests
app.use(express.methodOverride());

Mais quand même, quand je demande req.body.something dans mes itinéraires, je reçois une erreur signalant que body is undefined . Voici un exemple d'une route qui utilise req.body :

app.post('/admin', function(req, res){
    console.log(req.body.name);
});

J'ai lu que ce problème est causé par le manque de app.use(express.bodyParser()); mais comme vous pouvez le voir, je l'appelle avant les routes.

Un indice ?

0 votes

Ce n'est pas vraiment une solution à votre problème mais comme c'est le premier fil de discussion qui résulte de Google, je vais l'énoncer ici, assurez-vous qu'il n'y a pas d'autres middlewares qui se comportent mal.

623voto

Mark Bonano Points 612

MISE À JOUR juillet 2020

express.bodyParser() ne fait plus partie de l'offre groupée d'Express. Vous devez l'installer séparément avant le chargement :

npm i body-parser

// then in your app
var express = require('express')
var bodyParser = require('body-parser')

var app = express()

// create application/json parser
var jsonParser = bodyParser.json()

// create application/x-www-form-urlencoded parser
var urlencodedParser = bodyParser.urlencoded({ extended: false })

// POST /login gets urlencoded bodies
app.post('/login', urlencodedParser, function (req, res) {
  res.send('welcome, ' + req.body.username)
})

// POST /api/users gets JSON bodies
app.post('/api/users', jsonParser, function (req, res) {
  // create user in req.body
})

Voir ici pour plus d'informations

l'original suit

Vous devez vous assurer que vous définissez toutes les configurations AVANT de définir les routes. Si vous procédez ainsi, vous pouvez continuer à utiliser les services de express.bodyParser() .

Un exemple est le suivant :

var express = require('express'),
    app     = express(),
    port    = parseInt(process.env.PORT, 10) || 8080;

app.configure(function(){
  app.use(express.bodyParser());
  app.use(app.router);
});

app.listen(port);

app.post("/someRoute", function(req, res) {
  console.log(req.body);
  res.send({ status: 'SUCCESS' });
});

16 votes

Cela a marché pour moi. Note : Malheureusement, dans certains tutoriels, les gens (comme moi) placent les routes avant app.configure(). Dans mon cas, c'était sous la forme de app.get/post etc, et un require() les incluant.

11 votes

À partir d'express 4, app.use(app.router) est supprimé. veuillez consulter les docs github.com/visionmedia/express/wiki/New-features-in-4.x

18 votes

À partir d'express 4, les middlewares comme bodyParser ne sont plus fournis avec Express et doivent être installés séparément. Vous pouvez trouver plus d'informations ici : github.com/senchalabs/connect#middleware .

108voto

danmactough Points 1992

Non. Vous devez utiliser app.use(express.bodyParser()) avant app.use(app.router) . En effet, app.use(app.router) devrait être la dernière chose que vous appelez.

0 votes

Même en bougeant app.use(app.router) en vertu de la .use appelle ne résout pas le problème :(.

0 votes

Ok, après avoir lutté un peu, j'ai résolu le problème en utilisant app.use(require('connect').bodyParser()); au lieu de app.use(express.bodyParser()); .

0 votes

Oui, la réponse est vraie même en utilisant var router=express.Router() ;

49voto

Kevin Xue Points 248

Le Content-Type dans l'en-tête de la demande est vraiment important, surtout lorsque vous affichez les données à partir de curl ou de tout autre outil.

Assurez-vous que vous utilisez quelque chose comme application/x-www-form-urlencoded, application/json ou autres, cela dépend des données de votre message. Si vous laissez ce champ vide, Express sera confus.

16 votes

+1 C'était le problème pour moi. J'utilisais Postman pour Chrome pour tester une api JSON construite en REST, mais l'objet reçu par Express était vide à chaque fois. Il s'avère que Postman par défaut fait no ajoute automatiquement l'en-tête "Content-Type : application/json" même si vous sélectionnez raw > json.

0 votes

@Jordan +1 Merci de le signaler. En effet, je viens de vérifier mes en-têtes et je vois qu'il est toujours réglé sur 'text/plain' même si j'ai sélectionné 'json'.

43voto

Masiar Points 2623

Comme déjà posté sous un commentaire, je l'ai résolu en utilisant

app.use(require('connect').bodyParser());

au lieu de

app.use(express.bodyParser());

Je ne sais toujours pas pourquoi le simple express.bodyParser() ne fonctionne pas...

0 votes

OMG !! Vous avez sauvé ma journée ! J'ai passé toute la nuit à me demander pourquoi express.bodyParser() fonctionne pour une application, et la même requête se bloque dans une autre application. VOUS ÊTES UN HÉROÏNE !

1 votes

@Masiar Cela ne fonctionne pas pour moi. J'utilise expressjs 4 et j'obtiens une erreur comme celle-ci. Erreur : Impossible de trouver le module 'connect'.

1 votes

@JeyTheva ma solution est assez ancienne, donc les choses peuvent avoir changé entre temps. Je vous suggère d'essayer d'installer le connect module via npm install connect et réessayer. C'est la seule chose à laquelle je peux penser en lisant le résultat de votre erreur.

9voto

ab107 Points 61

Express.bodyParser() a besoin d'être informé du type de contenu qu'il analyse. Par conséquent, vous devez vous assurer que lorsque vous exécutez une requête POST, vous incluez l'en-tête "Content-Type". Sinon, bodyParser risque de ne pas savoir quoi faire avec le corps de votre requête POST.

Si vous utilisez curl pour exécuter une requête POST contenant un objet JSON dans le corps, cela ressemblera à quelque chose comme ceci :

curl -X POST -H "Content-Type: application/json" -d @your_json_file http://localhost:xxxx/someRoute

Si vous utilisez une autre méthode, veillez à définir ce champ d'en-tête en utilisant la convention appropriée.

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