¿Cómo recibir JSON en la solicitud POST express node.js?

Envío un POST WebRequest desde C # junto con datos de un objeto json. Y desea recibirlo en un servidor node.js como este:

var express = require('express'); var app = express.createServer(); app.configure(function(){ app.use(express.bodyParser()); }); app.post('/ReceiveJSON', function(req, res){ //Suppose I sent this data: {"a":2,"b":3} //Now how to extract this data from req here? //console.log("req a:"+req.body.a);//outputs 'undefined' //console.log("req body:"+req.body);//outputs '[object object]' res.send("ok"); }); app.listen(3000); console.log('listening to http://localhost:3000'); 

Además, el final C # de POST webRequest se invoca a través del siguiente método:

 public string TestPOSTWebRequest(string url,object data) { try { string reponseData = string.Empty; var webRequest = System.Net.WebRequest.Create(url) as HttpWebRequest; if (webRequest != null) { webRequest.Method = "POST"; webRequest.ServicePoint.Expect100Continue = false; webRequest.Timeout = 20000; webRequest.ContentType = "application/json; charset=utf-8"; DataContractJsonSerializer ser = new DataContractJsonSerializer(data.GetType()); MemoryStream ms = new MemoryStream(); ser.WriteObject(ms, data); String json = Encoding.UTF8.GetString(ms.ToArray()); StreamWriter writer = new StreamWriter(webRequest.GetRequestStream()); writer.Write(json); } var resp = (HttpWebResponse)webRequest.GetResponse(); Stream resStream = resp.GetResponseStream(); StreamReader reader = new StreamReader(resStream); reponseData = reader.ReadToEnd(); return reponseData; } catch (Exception x) { throw x; } } 

Invocación del método:

 TestPOSTWebRequest("http://localhost:3000/ReceiveJSON", new TestJSONType { a = 2, b = 3 }); 

¿Cómo puedo analizar los datos JSON del objeto de solicitud en el código node.js anterior?

La solicitud debe enviarse con: content-type: “application / json; charset = utf-8”

De lo contrario, el bodyParser patea tu objeto como una clave en otro objeto 🙂

bodyParser lo hace automáticamente por ti, solo con console.log(req.body)

Edición : su código es incorrecto porque primero incluye app.router (), antes del bodyParser y todo lo demás. Eso es malo. Ni siquiera debes incluir app.router (), Express lo hace automáticamente por ti. Así es como debe verse el código:

 var express = require('express'); var app = express.createServer(); app.configure(function(){ app.use(express.bodyParser()); }); app.post('/ReceiveJSON', function(req, res){ console.log(req.body); res.send("ok"); }); app.listen(3000); console.log('listening to http://localhost:3000'); 

Puede probar esto usando el módulo de Solicitud de Mikeal, enviando una solicitud POST con esos parámetros:

 var request = require('request'); request.post({ url: 'http://localhost:3000/ReceiveJSON', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ a: 1, b: 2, c: 3 }) }, function(error, response, body){ console.log(body); }); 

Actualización : use body-parser para express 4+.