2012-04-04 22 views
198

Sto inviando la seguente stringa JSON al mio server.Come consumo i dati JSON POST in un'applicazione Express

(
     { 
     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 corda, si dimostra che ho ricevuto una risposta 200, ma le altre due metodi non gestita. Perché?

risposta

258

Penso che tu stia confondendo l'uso dell'oggetto response con quello dello request.

L'oggetto response è per l'invio della risposta HTTP al client chiamante, mentre si desidera accedere al corpo di request. Vedi questo answer che fornisce alcune indicazioni.

Se si utilizza JSON valido e pubblichiamo con Content-Type: application/json, quindi è possibile utilizzare il bodyParser middleware per analizzare il corpo della richiesta e inserire il risultato in request.body del percorso.

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

di prova lungo le linee di:

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

aggiornati per Express parser 4+

corpo è stato scisso in essa del proprio 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); 
+0

Come dovrei accedere a "MyKey" per ottenere "il mio valore"? – neuromancer

+12

'request.body.MyKey' –

+0

Come mai non funziona per console.log (" request = "+ request.body)? – neuromancer

176

Per Express v4 +

installa body parser dal 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() 
}) 
+14

perché continuano a portare fuori roba che tutti usano? – light24bulbs

+9

@ light24bulbs Quindi (Express) sarà più snello e cattivo per chi non lo usa/ne ha bisogno. – andyengle

+5

@andyengle Questo ha senso. Ma penso che praticamente tutti usano l'analisi delle richieste. Sembra una caratteristica fondamentale per me. – light24bulbs

6

A volte non hanno bisogno di librerie di terze parti per analizzare JSON dal testo. A volte tutto ciò che serve è il seguente comando JS, provare 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

Ho trovato utile questo quando si analizza la risposta del server. Grazie! –

+1

Grazie, Hasan, apprezzo il tuo commento. Mi ha aiutato quando stavo cercando una soluzione e ho trovato questo post. Non sono sicuro che funzioni in tutti i casi, ma funziona sicuramente in alcuni ed è una soluzione migliore rispetto all'utilizzo di una libreria di terze parti. – xims