2013-07-23 16 views
36

Qui è il mio modello con una risposta JSON:Prendi un JSON via HTTP Request in NodeJS

exports.getUser = function(req, res, callback) { 
    User.find(req.body, function (err, data) { 
     if (err) { 
      res.json(err.errors); 
     } else { 
      res.json(data); 
     } 
    }); 
}; 

Qui ho capito tramite http.request. Perché ricevo (dati) una stringa e non un json?

var options = { 
    hostname: '127.0.0.1' 
    ,port: app.get('port') 
    ,path: '/users' 
    ,method: 'GET' 
    ,headers: { 'Content-Type': 'application/json' } 
}; 

var req = http.request(options, function(res) { 
    res.setEncoding('utf8'); 
    res.on('data', function (data) { 
     console.log(data); // I can't parse it because, it's a string. why? 
    }); 
}); 
reqA.on('error', function(e) { 
    console.log('problem with request: ' + e.message); 
}); 
reqA.end(); 

Come posso ottenere un JSON?

+0

JSON è una serializzazione. È solo JSON se si trova in una stringa, o altrimenti non ancora analizzato come JavaScript. Stai cercando 'JSON.parse()'? –

+0

questo è tutto. grazie Matt –

+0

Ho pensato che l'evento 'data' è stato chiamato più volte ogni volta con un argomento che è un blocco dei dati di stringa. Non sarebbe molto probabile che il 'data' restituito in quell'evento sia rotto JSON perché è solo una frazione del documento totale? Penso che sia necessario bufferizzare i dati e quindi usare 'JSON.parse()' nell'evento 'end'. – Sukima

risposta

52

http invia/riceve dati come stringhe ... questo è proprio come stanno le cose. Stai cercando di analizzare la stringa come json.

var jsonObject = JSON.parse(data); 

How to parse JSON using Node.js?

+2

... le mie scuse, è stato più semplice di quanto pensassi .... grazie Chris! –

+0

questo è veramente utile, grazie @ChrisCM –

45

Basta dire richiesta che si sta utilizzando JSON: vero e dimenticare intestazione e analizzare

var options = { 
    hostname: '127.0.0.1', 
    port: app.get('port'), 
    path: '/users', 
    method: 'GET', 
    json:true 
} 
request(options, function(error, response, body){ 
    if(error) console.log(error); 
    else console.log(body); 
}); 

e lo stesso per il post

var options = { 
    hostname: '127.0.0.1', 
    port: app.get('port'), 
    path: '/users', 
    method: 'POST', 
    json: {"name":"John", "lastname":"Doe"} 
} 
request(options, function(error, response, body){ 
    if(error) console.log(error); 
    else console.log(body); 
}); 
+0

Sapevo che la richiesta era in grado di fornire un corpo JSON ma la documentazione in realtà non era chiara su quella parte! Salva facendo un analisi ridondante. Ho anche la sensazione che tu possa fare 'response.toJSON()' – CJxD

+2

Questo non funziona per 'http.request', piuttosto [richiesta] (https://www.npmjs.com/package/request). – arve0

2

Proprio impostazione json opzione a true, il corpo w mal contiene il parsed json:

request({ 
    url: 'http://...', 
    json: true 
}, function(error, response, body) { 
    console.log(body); 
});