节点JSON https请求未定义

node JSON https request becoming undefined

本文关键字:未定义 请求 https JSON 节点      更新时间:2024-04-10

我正在尝试向API发送一个单独的https请求,其中包含一组JSON格式的数据。

然而,在运行代码时,我首先遇到的问题是,所有内容都是未定义的。我注释掉了我的循环,试图解析我需要的数据,现在我只是试图console.log所有的数据。

然而,尽管在我的代码中任何地方都没有循环,但它似乎仍然在以某种方式循环。

这是我请求的代码:

function getCards() {
  // make a request
  var options = {
    host: 'omgvamp-hearthstone-v1.p.mashape.com',
    path: '/cards',
    method: 'GET',
  };
  var req = https.request(options, function(res) {
    console.log('STATUS ' + res.statusCode);
    console.log('HEADERS ' + JSON.stringify(res.headers));
    res.setEncoding('utf8');
    res.on('data', function(data) {
      //console.log(data);
      updateCardsCollection(JSON.stringify(data));
    });
  });
  req.on('error', function(e) {
    console.log('problem with request: ' + e.message);
  });
  req.end();
}

奇怪的是,上面代码中的console.log(data)可以很好地注销所有数据。

function updateCardsCollection(data) {
  var cardsRaw = [];
  console.log("DATA");
  console.log("===========================================================");
  console.log(data.Classic);
}

这里的"经典"是API中的对象数组之一。

实施节点前,快递、猫鼬和翡翠。以下循环可以很好地解析数据:

   for(var key in data) {
     for(var i = 0; i < data[key].length; i++) {
       console.log(data[key][i].cardId);

然而,上面循环的开头也会打印出一个未定义的错误。

我对这段代码似乎遇到的另一个奇怪问题是,当我在注释掉循环的情况下运行它时,"updateCardsCollection"函数中只有3个console.log。它多次记录这3行。尽管函数只被调用过一次。

知道为什么这个代码不再用于获取我的API数据吗?

首先,如果您想使用对象而不是字符串,则在尝试更新集合时需要使用JSON.parse而不是JSON.stringify

但是,如果您先完成了,您的代码仍然无法工作,因为在data处理程序中,您获得的是chunked数据,而不是完全响应。看见https://nodejs.org/api/http.html#http_http_request_options_callback

你必须这样积累数据:

const req = https.request(options, res => {
    const data = [];
    res.on('data', d => data.push(d));
    res.on('end', () => updateCardsCollection(JSON.parse(data.join(''))));
})