Come si consumano i dati POST JSON in un'applicazione Express


307

Sto inviando la seguente stringa JSON al mio server.

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

Sul server ho questo.

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 invio la stringa, mostra che ho ricevuto una risposta 200, ma quegli altri due metodi non vengono mai eseguiti. Perché?

Risposte:


479

Penso che stai fondendo l'uso responsedell'oggetto con quello del request.

L' responseoggetto è per inviare la risposta HTTP al client chiamante, mentre si desidera accedere al corpo di request. Vedi questa risposta che fornisce alcune indicazioni.

Se si utilizza JSON valido e lo si sta postando Content-Type: application/json, è possibile utilizzare il bodyParsermiddleware per analizzare il corpo della richiesta e inserire il risultato nel request.bodypercorso.

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

Prova seguendo le linee di:

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

Aggiornato per Express 4+

Body parser è stato suddiviso nel suo pacchetto npm dopo v4, richiede un'installazione separata 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);

Aggiornamento per Express 4.16+

A partire dalla versione 4.16.0, express.json()è disponibile un nuovo 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);

21
request.body.MyKey
Pero P.

5
Perché la concatenazione invoca toString()l'oggetto. Dai un'occhiata ai documenti del nodo per console.log, in quanto ispeziona l'oggetto e restituisce una rappresentazione di stringa.
Pero P.

13
console.log('request =' + JSON.stringify(request.body))
Pero P.

3
La corrente console.log()stringerà automaticamente un oggetto (via util.inspect()), quindi funzionerebbe:console.log("with request", request.body);
Tommy Stanton,

4
Questa risposta è obsoleta, ma quella di @chrisarton è aggiornata.
Emil Ingerslev, l'

209

Per Express v4 +

installa body-parser da 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()
})

23
perché continuano a togliere cose che tutti usano?
light24bulbs

11
@ light24bulbs Quindi (Express) sarà più snello e cattivo per coloro che non lo usano / ne hanno bisogno.
andyengle

6
@andyengle Questo ha senso. Ma penso che praticamente tutti utilizzino l'analisi delle richieste. Mi sembra una caratteristica fondamentale.
light24bulbs,

23
Poiché l'interfaccia della funzione middleware è uno standard utilizzato da molte librerie, consente anche alle app che non utilizzano Express di utilizzare queste funzioni middleware.
Anm

3
La rimozione di express non consente l'utilizzo da parte di app che non utilizzano richieste. Avrebbero potuto renderlo separato e includerlo in express per impostazione predefinita.
JJ,

18

A volte non hai bisogno di librerie di terze parti per analizzare JSON dal testo. A volte tutto ciò che serve è il seguente comando JS, provalo prima:

        const res_data = JSON.parse(body);

3
La domanda originale riguarda l'analisi di JSON da un messaggio POST nel framework Express. Senza il middleware BodyParser, i dati JSON non esisteranno nella proprietà body dell'oggetto richiesta.
ThisClark

1
L'ho trovato utile durante l'analisi della risposta del server. Grazie!
Hasan Alsawadi,

1
Grazie Hasan, apprezzo il tuo commento. Mi ha aiutato quando cercavo una soluzione e mi sono imbattuto in questo post. Non sono sicuro che funzioni in tutti i casi ma sicuramente funziona in alcuni ed è una soluzione migliore rispetto all'utilizzo di librerie di terze parti.
xims,

1
La tua risposta e un commento forniscono alla risposta ulteriori informazioni (più informazioni sono la tua risposta qui). Dovresti aggiornare la tua risposta per indicare che express ha bisogno del body-parser o fornire un'alternativa per indicare come il body-parser ha ottenuto i dati in primo luogo.
Dewwwald,

2
non definiscebody
jameshfisher il

15

Per coloro che ottengono un oggetto vuoto req.body

Mi ero dimenticato di impostare headers: {"Content-Type": "application/json"} la richiesta. Modificarlo ha risolto il problema.


Non riesco a credere che mi sia perso questo! Stavo spedendo con text/jsone ricevendo {}come risposta. Totale controllo da parte mia. Molto utile.
James M. Lay

Ugh - Anche questo mi è mancato. Grazie per aver pubblicato questo, quindi non perdo più tempo di quello che ho già!
Steve Gomez,

9

@Daniel Thompson afferma di aver dimenticato di aggiungere {"Content-Type": "application / json"} nella richiesta . È stato in grado di modificare la richiesta, tuttavia, non è sempre possibile modificare le richieste (qui stiamo lavorando sul server).

Nel mio caso avevo bisogno di forzare il tipo di contenuto: text / plain da analizzare come json.

Se non è possibile modificare il tipo di contenuto della richiesta, provare a utilizzare il seguente codice:

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

Invece di usare express.json () a livello globale, preferisco applicarlo solo dove necessario, ad esempio in una richiesta POST:

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

7

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

Questo app.use (express.json) ora ti permetterà di leggere l'oggetto JSON post in arrivo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.