【问题标题】:Get a JSON via HTTP request in NodeJS在 NodeJS 中通过 HTTP 请求获取 JSON
【发布时间】:2013-07-22 14:52:06
【问题描述】:

这是我的带有 JSON 响应的模型:

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

我在这里通过http.request 得到它。为什么我收到(数据)的是字符串而不是 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();

如何获取 JSON?

【问题讨论】:

  • JSON 是一个序列化。如果它在字符串中,则它只是 JSON,或者尚未解析为 JavaScript。你在找JSON.parse()吗?
  • 就是这样。谢谢马特
  • 我认为data 事件每次都被多次调用,参数是字符串数据的一部分。在该事件中返回的data 是否很可能是损坏的 JSON,因为它只是整个文档的一小部分?我认为您需要缓冲数据,然后在您的end 事件中使用JSON.parse()
  • 你是对的,它是分块发送的,所以最好的方法是创建一个 Buffer 数组并将其推送到那里
  • 看到 Sasha Grey 提出的 nodejs 问题....:D

标签: json node.js api httprequest


【解决方案1】:

http 以字符串的形式发送/接收数据……这就是事情的本来面目。您希望将字符串解析为 json。

var jsonObject = JSON.parse(data);

How to parse JSON using Node.js?

【讨论】:

    【解决方案2】:

    只需告诉 request 你正在使用 json:true 并忘记标头和解析

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

    发帖也是这样

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

    【讨论】:

    • 我知道该请求能够提供 JSON 正文,但该部分的文档确实不清楚!节省了进行冗余解析。我也觉得你可以做到response.toJSON()
    • 这不适用于http.request,而是request
    【解决方案3】:

    只需将json 选项设置为true,正文将包含已解析的 JSON:

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

    【讨论】:

    • 这对我不起作用。必须是request lib,而不是http.request
    猜你喜欢
    • 2015-02-22
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2015-11-03
    • 2012-07-16
    • 2017-03-12
    • 2016-03-10
    相关资源
    最近更新 更多