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?
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);
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()
})
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);
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
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.
@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);
});