2013-07-23 19 views
36

Oto mój model z odpowiedzi json:Get json za pośrednictwem żądania HTTP w NodeJS

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

Tutaj mam to poprzez http.request. Dlaczego otrzymuję (dane) ciąg znaków, a nie 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(); 

Jak mogę uzyskać json?

+0

JSON jest serializacją. To jest tylko JSON, jeśli jest w ciągu znaków lub w inny sposób nie jest jeszcze analizowany jako JavaScript. Szukasz 'JSON.parse()'? –

+0

to jest to. dzięki Matt –

+0

Myślałem, że zdarzenie 'data' zostało wywołane wiele razy za każdym razem z argumentem będącym fragmentem danych łańcuchowych. Czy nie byłoby całkiem prawdopodobne, że "dane" zwrócone w tym przypadku zostaną uszkodzone JSON, ponieważ jest to tylko ułamek całego dokumentu? Myślę, że musisz buforować dane, a następnie użyć 'JSON.parse()' w swoim zdarzeniu 'end'. – Sukima

Odpowiedz

52

http wysyła/odbiera dane jako ciągi znaków ... tak po prostu jest. Chcesz przeanalizować ciąg jako json.

var jsonObject = JSON.parse(data); 

How to parse JSON using Node.js?

+2

... moje przeprosiny, to było prostsze niż myślałem .... dziękuję Chris! –

+0

to jest bardzo pomocne, dzięki @ChrisCM –

45

Wystarczy powiedzieć wniosek, że używasz json: true i zapomnieć o nagłówku i analizowania

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

i taka sama dla słupka

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

Wiedziałem, że wniosek był w stanie dać ciała JSON, ale dokumentacja naprawdę nie było jasne w tej części! Zapisuje wykonywanie zbędnego przetwarzania. Mam również wrażenie, że możesz zrobić 'response.toJSON()' – CJxD

+2

To nie działa dla 'http.request', raczej [request] (https://www.npmjs.com/package/request). – arve0

2

prostu ustawienie json opcja do true, ciało w ill zawiera sparsowany json:

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