353 votes

Comment accéder au corps de la requête lors d'un POST en utilisant Node.js et Express ?

J'ai le code Node.js suivant :

var express = require('express');
var app = express.createServer(express.logger());
app.use(express.bodyParser());

app.post('/', function(request, response) {
    response.write(request.body.user);
    response.end();
});

Maintenant si je POST quelque chose comme :

curl -d user=Someone -H Accept:application/json --url http://localhost:5000

Je reçois Someone comme prévu. Maintenant, que faire si je veux obtenir le corps complet de la requête ? J'ai essayé de faire response.write(request.body) mais Node.js lance une exception disant " le premier argument doit être une chaîne ou un tampon " puis passe à une "boucle infinie" avec une exception qui dit " Impossible de définir les en-têtes après leur envoi. "Ceci est également vrai même si j'ai fait var reqBody = request.body; et ensuite écrire response.write(reqBody) .

Quel est le problème ici ?

Aussi, puis-je obtenir la requête brute sans utiliser express.bodyParser() ?

492voto

rustyx Points 2722

À partir de express v4.16 il n'est pas nécessaire d'avoir recours à des modules supplémentaires, il suffit d'utiliser le module intégré intergiciel JSON :

app.use(express.json())

Comme ça :

const express = require('express')

app.use(express.json())    // <==== parse request body as JSON

app.listen(8080)

app.post('/test', (req, res) => {
  res.json({requestBody: req.body})  // <==== req.body will be a parsed JSON object
})

Note - body-parser dont il dépend, est déjà inclus en express.

N'oubliez pas non plus d'envoyer l'en-tête Content-Type: application/json

210voto

Hector Correa Points 10408

Express 4.0 et plus :

$ npm install --save body-parser

Et ensuite dans votre application Node :

const bodyParser = require('body-parser');
app.use(bodyParser);

Express 3.0 et inférieur :

Essayez de passer ceci dans votre appel cURL :

--header "Content-Type: application/json"

et assurez-vous que vos données sont au format JSON :

{"user":"someone"}

Vous pouvez également utiliser console.dir dans votre code node.js pour voir les données à l'intérieur de l'objet comme dans l'exemple suivant :

var express = require('express');
var app = express.createServer();

app.use(express.bodyParser());

app.post('/', function(req, res){
    console.dir(req.body);
    res.send("test");
}); 

app.listen(3000);

Cette autre question pourrait également vous aider : Comment recevoir JSON dans une requête POST express node.js ?

Si vous ne souhaitez pas utiliser le bodyParser, consultez cette autre question : https://stackoverflow.com/a/9920700/446681

45voto

Walter Roman Points 596

À partir d'Express 4, le code suivant semble faire l'affaire. Notez que vous devrez installer body-parser en utilisant npm .

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));

app.listen(8888);

app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

42voto

Shivam Gupta Points 141

Pour 2019, vous n'avez pas besoin d'installer body-parser .

Vous pouvez utiliser :

var express = require('express');
var app = express();
app.use(express.json())
app.use(express.urlencoded({extended: true}))
app.listen(8888);
app.post('/update', function(req, res) {
    console.log(req.body); // the posted data
});

42voto

Hadi Mir Points 78

Vous ne devez pas utiliser body-parser il est déprécié. Essayez plutôt ceci

const express = require('express')
const app = express()

app.use(express.json()) //Notice express.json middleware

Le site app.use() est utilisée pour monter la (les) fonction(s) d'intergiciel spécifiée(s) au chemin spécifié. Elle est principalement utilisée pour mettre en place un middleware pour votre application.

Maintenant, pour accéder au corps, il suffit de faire ce qui suit

app.post('/', (req, res) => {
  console.log(req.body)
})

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