Como consumir os dados JSON POST em um aplicativo Express

307

Estou enviando a seguinte string JSON para o meu servidor.

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

No servidor eu tenho isso.

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

Quando envio a string, mostra que recebi uma resposta de 200, mas esses outros dois métodos nunca são executados. Por que é que?

neuromancer
fonte

Respostas:

479

Eu acho que você está confundindo o uso do responseobjeto com o do request.

O responseobjetivo é enviar a resposta HTTP de volta ao cliente que está chamando, enquanto você deseja acessar o corpo do request. Veja esta resposta que fornece algumas orientações.

Se você estiver usando JSON válido e o estiver postando Content-Type: application/json, poderá usar o bodyParsermiddleware para analisar o corpo da solicitação e colocar o resultado em request.bodysua rota.

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

Teste ao longo das linhas de:

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

Atualizado para o Express 4+

O analisador de corpo foi dividido em seu próprio pacote npm após a v4, requer uma instalação 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);

Atualização para Express 4.16+

A partir do release 4.16.0, um novo express.json()middleware está disponível.

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.
fonte
21
request.body.MyKey
Pero P.
5
Porque a concatenação chama toString()no objeto. Dê uma olhada nos documentos do nó console.log, pois isso inspeciona o objeto e retorna uma representação de sequência.
Pero P.
13
console.log('request =' + JSON.stringify(request.body))
Pero P.
3
A corrente console.log()irá automaticamente restringir um objeto (via util.inspect()), para que isso funcione:console.log("with request", request.body);
Tommy Stanton
4
Esta resposta está desatualizada, mas a resposta de @chrisarton está atualizada.
Emil Ingerslev
209

Para Express v4 +

instale o analisador de corpo a partir do 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
fonte
23
por que eles continuam pegando coisas que todo mundo usa?
light24bulbs
11
@ light24bulbs Portanto, o (Express) será mais enxuto e mais ruim para quem não usa / precisa disso.
precisa saber é o seguinte
6
@andyengle Isso faz sentido. Mas acho que praticamente todo mundo usa a análise de pedidos. Isso parece ser um recurso essencial para mim.
Light24bulbs
23
Como a interface da função de middleware é um padrão usado por muitas bibliotecas, também permite que aplicativos que não usam o Express usem essas funções de middleware.
Anm
3
Tirá-lo do Express não permite que ele seja usado por aplicativos que não usam solicitações. Eles poderiam tê-lo separado e incluído no express por padrão.
JJ
18

Às vezes, você não precisa de bibliotecas de terceiros para analisar o JSON do texto. Às vezes, tudo o que você precisa é o seguinte comando JS, tente primeiro:

        const res_data = JSON.parse(body);
xims
fonte
3
A pergunta original é sobre a análise de JSON a partir de uma mensagem POST na estrutura Express. Sem o middleware BodyParser, os dados JSON não existirão na propriedade body do objeto de solicitação.
precisa saber é o seguinte
1
Achei isso útil ao analisar a resposta do servidor. Obrigado!
Hasan Alsawadi
1
Obrigado Hasan, agradeço seu comentário. Isso me ajudou quando eu estava procurando uma solução e me deparei com este post. Não tenho certeza se funciona em todos os casos, mas definitivamente funciona em alguns e é uma solução melhor do que usar uma biblioteca de terceiros.
Xims
1
Sua resposta e um comentário fornecem a resposta com mais informações (mais informações sendo sua resposta aqui). Você deve atualizar sua resposta para indicar que o express precisa do analisador de corpo ou fornecer uma alternativa para indicar como o analisador de corpo obteve os dados em primeiro lugar.
dewwwald
2
não definebody
jameshfisher
15

Para aqueles que estão recebendo um objeto vazio em req.body

Eu tinha esquecido de fazer headers: {"Content-Type": "application/json"} o pedido. Mudá-lo resolveu o problema.

Daniel Thompson
fonte
Não posso acreditar que eu perdi isso! Eu estava enviando text/jsone recebendo {}como resposta. Supervisão total da minha parte. Muito útil.
James M. Lay
Ugh - eu também senti falta disso. Obrigado por postar isso, para não perder mais tempo do que já tenho!
Steve Gomez
9

@ Daniel Thompson menciona que ele havia esquecido de adicionar {"Content-Type": "application / json"} na solicitação . Ele conseguiu alterar a solicitação, no entanto, nem sempre é possível alterar solicitações (estamos trabalhando no servidor aqui).

No meu caso, eu precisava forçar o tipo de conteúdo: text / plain a ser analisado como json.

Se você não pode alterar o tipo de conteúdo da solicitação, tente usar o seguinte código:

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

Em vez de usar express.json () globalmente, prefiro aplicá-lo somente quando necessário, por exemplo, em uma solicitação POST:

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

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

Este app.use (express.json) agora permitirá que você leia o objeto JSON da postagem recebida

SuRa
fonte