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

307

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

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

Sur le serveur, je l'ai.

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 obtenu une réponse de 200, mais ces deux autres méthodes ne fonctionnent jamais. Pourquoi donc?

neuromancien
la source

Réponses:

479

Je pense que vous confondez l'utilisation de l' responseobjet avec celle du request.

L' responseobjet sert à renvoyer la réponse HTTP au client appelant, alors que vous souhaitez accéder au corps du request. Voir cette réponse qui fournit quelques conseils.

Si vous utilisez un JSON valide et que vous le postez avec Content-Type: application/json, vous pouvez utiliser le bodyParsermiddleware pour analyser le corps de la demande et placer le résultat dans request.bodyvotre itinéraire.

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

Testez le long des lignes 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 corporel a été divisé en son propre package 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+

Depuis la version 4.16.0, un nouveau express.json()middleware 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);
Pero P.
la source
21
request.body.MyKey
Pero P.
5
Parce que la concaténation invoque toString()l'objet. Jetez un œil aux documents du nœud console.log, car cela inspecte l'objet et renvoie une représentation sous forme de chaîne.
Pero P.
13
console.log('request =' + JSON.stringify(request.body))
Pero P.
3
Le courant console.log()stringifiera automatiquement un objet (via util.inspect()), donc cela fonctionnerait:console.log("with request", request.body);
Tommy Stanton
4
Cette réponse est dépassée, mais celle de @chrisarton est à jour.
Emil Ingerslev
209

Pour Express v4 +

installez l'analyseur de corps à 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()
})
chrisarton
la source
23
pourquoi continuent-ils à retirer des trucs que tout le monde utilise?
light24bulbs
11
@ light24bulbs Ainsi, (Express) sera plus maigre et méchant pour ceux qui n'en utilisent pas / n'en ont pas besoin.
andyengle
6
@andyengle Cela a du sens. Mais je pense que pratiquement tout le monde utilise l'analyse des demandes. Cela me semble être une caractéristique essentielle.
light24bulbs
23
Étant donné que l'interface de la fonction middleware est une norme utilisée par de nombreuses bibliothèques, elle permet également aux applications qui n'utilisent pas Express d'utiliser ces fonctions middleware.
Anm
3
Le retirer de l'express ne permet pas qu'il soit utilisé par des applications qui n'utilisent pas de requêtes. Ils auraient pu le séparer et l'inclure dans express par défaut.
JJ
18

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

        const res_data = JSON.parse(body);
xims
la source
3
La question d'origine concerne l'analyse de JSON à partir d'un message POST dans le framework Express. Sans le middleware BodyParser, les données JSON n'existeront pas dans la propriété body de l'objet de requête.
ThisClark
1
J'ai trouvé cela utile lors de l'analyse de la réponse du serveur. Merci!
Hasan Alsawadi
1
Merci Hasan, j'apprécie ton commentaire. Cela m'a aidé lorsque je cherchais une solution et suis tombé sur ce message. Je ne sais pas si cela fonctionne dans tous les cas, mais cela fonctionne certainement dans certains et c'est une meilleure solution que d'utiliser une bibliothèque tierce.
xims
1
Votre réponse et un commentaire fournissent la réponse avec plus d'informations (plus d'informations étant votre réponse ici). Vous devez mettre à jour votre réponse pour indiquer qu'express a besoin de l'analyseur corporel ou donner une alternative pour indiquer comment l'analyseur corporel a obtenu les données en premier lieu.
dewwwald
2
ne définit pasbody
jameshfisher
15

Pour ceux qui obtiennent un objet vide dans req.body

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

Daniel Thompson
la source
Je ne peux pas croire que j'ai raté ça! J'envoyais avec text/jsonet recevais {}comme réponse. Un contrôle total de ma part. Très utile.
James M. Lay
Ugh - J'ai aussi raté ça. Merci d'avoir posté ceci pour ne pas perdre plus de temps que je n'en ai déjà!
Steve Gomez
9

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

Dans mon cas, j'avais besoin de forcer content-type: text / plain à être analysé en json.

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

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

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

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

const express = require('express');
let app = express();
app.use(express.json());

Ce app.use (express.json) vous permet désormais de lire l'objet JSON de message entrant

SuRa
la source