web-dev-qa-db-fra.com

Comment accéder au corps de la demande lors de l'envoi d'une requête à l'aide de 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, si je veux obtenir le corps complet de la demande? J'ai essayé de faire response.write(request.body) mais Node.js lève une exception disant "le premier argument doit être une chaîne ou un tampon" puis passe à une "boucle infinie" avec une exception disant "Impossible de définir les en-têtes après leur envoi. "; Cela est également vrai même si j’ai fait var reqBody = request.body; puis que j’écrivais response.write(reqBody).

Quel est le problème ici?

De plus, puis-je obtenir la demande brute sans utiliser express.bodyParser()?

137
TheBlueSky

Express 4.0 et supérieur:

$ npm install --save body-parser

Et ensuite dans votre application de nœud:

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

Express 3.0 et ci-dessous:

Essayez de transmettre ceci dans votre appel cURL:

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

et en vous assurant que vos données sont au format JSON:

{"user":"someone"}

De plus, vous pouvez utiliser console.dir dans votre code node.js pour afficher 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 aider: Comment recevoir du JSON dans une demande express node.js POST?

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

128
Hector Correa

À partir de express v4.16 , il n’est pas nécessaire de demander des modules supplémentaires, utilisez simplement le middleware JSON intégré :

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
})

Remarque - body-parser, dont cela dépend, est déjà inclus avec express.

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

99
rustyx

A partir d'Express 4, le code suivant apparaît pour faire l'affaire. Notez que vous devrez installer body-parser à l'aide de 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
});
40
Walter Roman
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json())

var port = 9000;

app.post('/post/data', function(req, res) {
    console.log('receiving data...');
    console.log('body is ',req.body);
    res.send(req.body);
});

// start the server
app.listen(port);
console.log('Server started! At http://localhost:' + port);

Cela vous aidera. Je suppose que vous envoyez des corps en JSON.

24
Gautam

Ceci peut également être réalisé sans la dépendance body-parser, écoutez request:data et request:end et renvoyez la réponse à la fin de la demande, voir ci-dessous exemple de code. ref: https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/#request-body

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

app.post('/', function(request, response) {

    // Push the data to body
    var body = [];
    request.on('data', (chunk) => {
      body.Push(chunk);
    }).on('end', () => {
      // on end of data, perform necessary action
      body = Buffer.concat(body).toString();
      response.write(request.body.user);
      response.end();
    });
});
6
Manivannan

Essaye ça:

response.write(JSON.stringify(request.body));

Cela prendra l'objet que bodyParser a créé pour vous, le transformera en chaîne et l'écrira dans la réponse. Si vous voulez le corps de requête exact (avec le même espace, etc.), vous aurez besoin des écouteurs data et end attachés à la demande avant et de construire le morceau de chaîne par morceau comme vous pouvez le voir dans JSON analysant le code source de connect .

3
Peter Lyons

Ce que vous prétendez avoir "essayé de faire" est exactement ce que vous avez écrit dans le code qui fonctionne "comme prévu" lorsque vous l'invoquez avec curl.

L'erreur que vous obtenez ne semble pas être liée au code que vous nous avez montré.

Si vous voulez obtenir la requête brute, définissez les gestionnaires sur request pour les événements data et end (et, bien sûr, supprimez toute invocation de express.bodyParser()). Notez que les événements data se produiront dans des fragments et que, à moins que vous ne définissiez un codage pour l'événement data, ces morceaux seront des tampons, pas des chaînes.

1
ebohlman

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
});
0
Shivam Gupta

Si vous êtes assez paresseux pour lire des morceaux de données post. vous pouvez simplement coller les lignes ci-dessous pour lire JSON.

Vous trouverez ci-dessous une procédure similaire pour TypeScript.

app.ts

 import bodyParser from "body-parser";
 // support application/json type post data
 this.app.use(bodyParser.json());
 // support application/x-www-form-urlencoded post data
 this.app.use(bodyParser.urlencoded({ extended: false }));

Dans l’un de vos contrôleurs qui reçoit POST appel, comme indiqué ci-dessous

serController.ts

 public async POSTUser(_req: Request, _res: Response) {
   try {
          const onRecord = <UserModel>_req.body;
           /* Your business logic */
           _res.status(201).send("User Created");
        }
    else{
           _res.status(500).send("Server error");
           }        
   };

_req.body devrait vous analyser les données Json dans votre modèle TS.

0
Shujaath Khan