76

Here is my model with a JSON response:

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

Here I get it via http.request. Why do I receive (data) a string and not a 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();

How can I get a JSON?

4
  • JSON is a serialization. It's only JSON if it's in a string, or otherwise not-yet-parsed as JavaScript. Are you looking for JSON.parse()? Commented Jul 23, 2013 at 13:42
  • I thought the data event was called multiple times each time with an argument that is a chunk of the string data. Wouldn't it be quite likely that the data returned in that event be broken JSON because it's only a fraction of the total document? I think you need to buffer the data and then use JSON.parse() in your end event. Commented Sep 17, 2014 at 2:01
  • You're right, it sends in chunks , so the best way is create a Buffer array and push it there Commented Jul 30, 2015 at 0:58
  • Also notice that reqA is not defined in your code Commented Jan 19, 2022 at 13:08

3 Answers 3

93

http sends/receives data as strings... this is just the way things are. You are looking to parse the string as json.

var jsonObject = JSON.parse(data);

How to parse JSON using Node.js?

Sign up to request clarification or add additional context in comments.

Comments

76

Just tell request that you are using json:true and forget about header and parse

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

and the same for 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);
});

2 Comments

I knew that request was able to give a JSON body but the documentation really wasn't clear on that part! Saves doing a redundant parse. I also get the feeling you can do response.toJSON()
This does not work for http.request, rather request.
25

Just setting json option to true, the body will contain the parsed JSON:

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

1 Comment

this doesn't work for me. It must be for request lib, not http.request

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.