web-dev-qa-db-fra.com

Comment utiliser les données JSON POST dans une application Express

J'envoie la chaîne JSON suivante à mon serveur.

(
        {
        id = 1;
        name = foo;
    },
        {
        id = 2;
        name = bar;
    }
)

Sur le serveur, j'ai ceci.

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

    console.log("Got response: " + response.statusCode);

    response.on('data', function(chunk) {
        queryResponse+=chunk;
        console.log('data');
    });

    response.on('end', function(){
        console.log('end');
    });
});

Lorsque j'envoie la chaîne, cela montre que j'ai reçu une réponse 200, mais ces deux autres méthodes ne s'exécutent jamais. Pourquoi donc?

272
neuromancer

Je pense que vous confondez l’utilisation de l’objet response avec celle de request.

L'objet response permet de renvoyer la réponse HTTP au client appelant, alors que vous souhaitez accéder au corps de request. Voir ceci réponse qui fournit quelques indications.

Si vous utilisez un JSON valide et que vous le postez avec Content-Type: application/json, vous pouvez utiliser le middleware bodyParser pour analyser le corps de la demande et placer le résultat dans request.body de votre route.

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

app.use(express.bodyParser());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
  response.send(request.body);    // echo the result back
});

app.listen(3000);

Tester dans le sens de:

$ curl -d '{"MyKey":"My Value"}' -H "Content-Type: application/json" http://127.0.0.1:3000/
{"MyKey":"My Value"}

mis à jour pour Express 4 +

L'analyseur de corps a été scindé en son propre paquet npm après la v4, nécessite une installation distincte npm install body-parser

var express = require('express')
  , bodyParser = require('body-parser');

var app = express();

app.use(bodyParser.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);

Mise à jour pour Express 4.16 +

À partir de la version 4.16.0, un nouveau middleware express.json() est disponible.

var express = require('express');

var app = express();

app.use(express.json());

app.post('/', function(request, response){
  console.log(request.body);      // your JSON
   response.send(request.body);    // echo the result back
});

app.listen(3000);
407
Pero P.

Pour Express v4 +

installez body-analyseur à partir du npm.

$ npm install body-parser

https://www.npmjs.org/package/body-parser#installation

var express    = require('express')
var bodyParser = require('body-parser')

var app = express()

// parse application/json
app.use(bodyParser.json())

app.use(function (req, res, next) {
  console.log(req.body) // populated!
  next()
})
196
chrisarton

Parfois, vous n'avez pas besoin de bibliothèques tierces pour analyser JSON à partir de texte. Parfois, tout ce dont vous avez besoin de la commande JS suivante, essayez d’abord:

        const res_data = JSON.parse(body);
12
xims
const express = require('express');
let app = express();
app.use(express.json());

Cette application (express.json) vous permettra désormais de lire l'objet JSON de publication

4
SuRa

Pour ceux qui obtiennent un objet vide dans req.body

J'avais oublié de définir headers: {"Content-Type": "application/json"} dans la requête. Le changer a résolu le problème.

3
Daniel Thompson

@Daniel Thompson mentionne qu'il a oublié d'ajouter {"Content-Type": "application/json"} dans la demande. Il a été capable de changer la demande, cependant, changer de demande n'est pas toujours possible (nous travaillons sur le serveur ici).

Dans mon cas, je devais forcer content-type: text/plain à être analysé comme json.

Si vous ne pouvez pas changer le type de contenu de la demande, essayez d'utiliser le code suivant:

app.use(express.json({type: '*/*'}));

Au lieu d'utiliser express.json () globalement, je préfère l'appliquer uniquement si nécessaire, par exemple dans une requête POST:

app.post('/mypost', express.json({type: '*/*'}), (req, res) => {
  // echo json
  res.json(req.body);
});
0
anneb