¿Cómo consumo los datos JSON POST en una aplicación Express?

307

Estoy enviando la siguiente cadena JSON a mi servidor.

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

En el servidor tengo esto.

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

Cuando envío la cadena, muestra que obtuve una respuesta 200, pero esos otros dos métodos nunca se ejecutan. ¿Porqué es eso?

neuromante
fuente

Respuestas:

479

Creo que estás combinando el uso del responseobjeto con el del request.

El responseobjetivo es enviar la respuesta HTTP al cliente que realiza la llamada, mientras que desea acceder al cuerpo del request. Ver esta respuesta que proporciona alguna orientación.

Si está utilizando un JSON válido y lo está PUBLICANDO Content-Type: application/json, puede usar el bodyParsermiddleware para analizar el cuerpo de la solicitud y colocar el resultado request.bodyde su ruta.

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

Prueba a lo largo de las líneas de:

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

Actualizado para Express 4+

El analizador del cuerpo se dividió en su propio paquete npm después de la v4, requiere una instalación separada 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);

Actualización para Express 4.16+

A partir de la versión 4.16.0, express.json()hay disponible un nuevo middleware.

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.
fuente
21
request.body.MyKey
Pero P.
55
Porque la concatenación invoca toString()en el objeto. Eche un vistazo a los documentos del nodo console.log, ya que inspecciona el objeto y devuelve una representación de cadena.
Pero P.
13
console.log('request =' + JSON.stringify(request.body))
Pero P.
3
La corriente console.log()automáticamente encadenará un objeto (vía util.inspect()), por lo que esto funcionaría:console.log("with request", request.body);
Tommy Stanton
44
Esta respuesta está desactualizada, pero la de @chrisarton está actualizada.
Emil Ingerslev
209

Para Express v4 +

instale body-parser desde el 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
fuente
23
¿Por qué siguen sacando cosas que todos usan?
light24bulbs
11
@ light24bulbs Entonces (Express) será más delgado y malo para aquellos que no usan / necesitan eso.
andyengle
66
@andyengle Eso tiene sentido. Pero creo que prácticamente todos usan el análisis de solicitudes. Eso me parece una característica central.
light24bulbs
23
Dado que la interfaz de la función de middleware es un estándar utilizado por muchas bibliotecas, también permite que las aplicaciones que no usan Express utilicen estas funciones de middleware.
Anm
3
Sacarlo de express no permite que las aplicaciones que no usan solicitudes lo usen. Podrían haberlo hecho por separado, e incluirlo en express por defecto.
JJ
18

A veces no necesita bibliotecas de terceros para analizar JSON del texto. A veces todo lo que necesitas es el siguiente comando JS, pruébalo primero:

        const res_data = JSON.parse(body);
xims
fuente
3
La pregunta original es sobre analizar JSON desde un mensaje POST en el marco Express. Sin el middleware BodyParser, los datos JSON no existirán en la propiedad del cuerpo del objeto de solicitud.
ThisClark
1
Encontré esto útil, al analizar la respuesta del servidor. ¡Gracias!
Hasan Alsawadi
1
Gracias Hasan, agradezco tu comentario. Me ayudó cuando estaba buscando una solución y encontré esta publicación. No estoy seguro de si funciona en todos los casos, pero definitivamente funciona en algunos y es una mejor solución que usar una biblioteca de terceros.
Xims
1
Su respuesta y un comentario proporcionan la respuesta con más información (más información será su respuesta aquí). Debe actualizar su respuesta para indicar que express necesita el analizador del cuerpo o dar una alternativa para indicar cómo el analizador del cuerpo obtuvo los datos en primer lugar.
dewwwald
2
no definebody
jameshfisher
15

Para aquellos que obtienen un objeto vacío en req.body

Se me había olvidado establecer headers: {"Content-Type": "application/json"} la solicitud. Cambiarlo resolvió el problema.

Daniel Thompson
fuente
¡No puedo creer que me haya perdido esto! Estaba enviando con text/jsony obteniendo {}como respuesta. Supervisión total de mi parte. Muy útil.
James M. Lay
Ugh, también me perdí esto. ¡Gracias por publicar esto para no perder más tiempo del que ya tengo!
Steve Gomez
9

@Daniel Thompson menciona que se había olvidado de agregar {"Content-Type": "application / json"} en la solicitud . Pudo cambiar la solicitud, sin embargo, no siempre es posible cambiar las solicitudes (aquí estamos trabajando en el servidor).

En mi caso, necesitaba forzar el tipo de contenido: text / plain para que se analizara como json.

Si no puede cambiar el tipo de contenido de la solicitud, intente usar el siguiente código:

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

En lugar de usar express.json () globalmente, prefiero aplicarlo solo donde sea necesario, por ejemplo, en una solicitud POST:

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

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

Este app.use (express.json) ahora le permitirá leer el objeto JSON de entrada entrante

Sura
fuente