Node.js无法使用JSON数据读取未定义的属性

时间:2017-09-27 13:27:07

标签: javascript json node.js

我试图将js脚本转换为node.js脚本。 JS脚本工作正常,并设法从this URL提取数据并正确使用这些信息。但是,当我尝试在Node.js上运行它时,我收到错误"Cannot read property of 'fixtures' undefined."我已添加this package来提取数据,但我不确定为什么会这样做。现在抛出一个错误。

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest();

//Get Data
var getJSON = function(url, callback) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'json';
    xhr.onload = function() {
        var status = xhr.status;
        if (status === 200) {
        callback(null, xhr.response);
        } else {
        callback(status, xhr.response);
        }
    };
    xhr.send();
};

//Use Data
getJSON('http://api.football-data.org/v1/teams/343/fixtures',
function(err, data) {
    if (err !== null) {
    console.log("   An error has occured.")
    } else {
    var latest;
    for(x = 0; data.fixtures[x].status !== "TIMED"; x++) {
        latest = data.fixtures[x].matchday - 1;
    }
}};

错误行在while(data.fixtures[x].status !== "TIMED")行,错误是

for(x = 0; data.fixtures[x].status !== "TIMED"; x++) {
               ^

TypeError: Cannot read property 'fixtures' of undefined

请您解释一下为什么JS可以看到数据并使用它,但node.js看到该属性未定义?

非常感谢。

编辑:删除了不应该存在的遗留循环。

2 个答案:

答案 0 :(得分:1)

xmlhttprequest属性是XMLHttpRequest Level 2部分,但xhr.response目前仅支持1:

  

注意:此库目前符合XMLHttpRequest 1。

因此undefined将是xhr.responseText

只会设置if (status === 200) { try { // use a try block here in case the the response is not parseable callback(null, JSON.parse(xhr.responseText)); } catch(e) { callback(e) } } else { callback(status, xhr.response); } ,这是一个字符串,因此您需要自己添加json的解析。

{{1}}

答案 1 :(得分:0)

您收到该消息的原因是因为回调中的变量data undefined。它之所以如此,是因为你传递了

callback(null, xhr.response); //<-- You should have used responseText

但即使这样也无法解决问题 - 文字不是json。所以解析它

callback(null, JSON.parse(xhr.responseText));