开发者问题收集

无法获取 JSON 对象的长度

2018-03-19
691

尝试访问 nodejs 中 json 对象的长度时,出现“TypeError:无法将未定义或 null 转换为对象”。

以下是我的数据的样子:

{
  "college": [
    {
      "colleges": [],
      "department": [
        1,
        2,
        3
      ],
      "general_course": [],
      "id": 1,
      "name": "College of the Arts",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1919"
    },
    {
      "colleges": [],
      "department": [
        4,
        5,
        6
      ],
      "general_course": [],
      "id": 2,
      "name": "College of Communications",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1920"
    },
    {
      "colleges": [],
      "department": [
        7,
        12
      ],
      "general_course": [],
      "id": 3,
      "name": "College of Education",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1921"
    },
    {
      "colleges": [],
      "department": [
        13,
        17,
        19
      ],
      "general_course": [],
      "id": 4,
      "name": "College of Engineering and Computer Science",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1922"
    },
    {
      "colleges": [],
      "department": [
        20,
        26,
        27
      ],
      "general_course": [],
      "id": 5,
      "name": "College of Health and Human Development",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1923"
    },
    {
      "colleges": [],
      "department": [
        28,
        29,
        32,
        48
      ],
      "general_course": [],
      "id": 6,
      "name": "College of Humanities and Social Sciences",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1924"
    },
    {
      "colleges": [],
      "department": [
        52,
        57
      ],
      "general_course": [],
      "id": 7,
      "name": "College of Natural Sciences and Mathematics",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1925"
    },
    {
      "colleges": [],
      "department": [
        58,
        59,
        63
      ],
      "general_course": [],
      "id": 8,
      "name": "Mihaylo College of Business and Economics",
      "short_name": "",
      "url": "/content.php?catoid=16&navoid=1926"
    }
  ]
}

步骤 1 - 将其解析为 nodejs:

let colleges = JSON.parse(data)

步骤 2 - 将其保存到 dialogflow 应用数据中:

app.data.collegeData = data;

步骤 3 - 访问长度:

let collegeLength = Object.keys(app.data.collegeData.college).length;

在 firebase 控制台中获取以下错误:

TypeError: Cannot convert undefined or null to object

更新:

这是代码:

if ( app.data.collegeData === undefined ){
    app.data.collegeData = [];
}

**Step 1 =>** 

showColleges(college);

**Step 2 =>**

  function showColleges(collegeName){
      if (app.data.collegeData.length === 0){
          getCollegeData().then(buildSingleCollegeResponse(collegeName))
              .catch(function (err){
                  console.log('No college data')
                  console.log(err)
              });
      }
      else{
          buildSingleCollegeResponse(collegeName);
      }
  }

**Step 3 =>**

 function getCollegeData(){
      console.log('Inside get College Data')
      return requestAPI(URL)
          .then(function (data) {
              let colleges = JSON.parse(data)
              if (colleges.hasOwnProperty('college')){
                  saveData(colleges)
              }
              return null;
          })
          .catch(function (err) {
              console.log('No college data')
              console.log(err)
          });
  }

**Step 4 =>**

  function saveData(data){
      app.data.collegeData = data;
      console.log(app.data.collegeData)
  }

**Step 5 =>**

function buildSingleCollegeResponse(collegeName){
      let responseToUser, text;
      //console.log('Data is -> '+ Object.keys(app.data.collegeData.college).length);
      //console.log('Length is -> '+ app.data.collegeData.college.length);
      console.log('Count is -> '+app.data.collegeCount);

      let collegeLength = Object.keys(app.data.collegeData.college).length;

      if ( collegeLength === 0){
          responseToUser = 'No colleges available at this time';
          text = 'No colleges available at this time';
      }
      else if ( app.data.collegeCount < collegeLength ){

          for ( var i = 1; i <= collegeLength; i++)
          {
              console.log('All Colleges:: '+app.data.collegeData.college[i])
              let coll = app.data.collegeData.college[i]
              let name = coll.name
              console.log('checkCollegeExist => College Name:: '+ name)
              console.log('checkCollegeExist => Parameter => College Name:: '+collegeName)

              if(String(name).valueOf() === String(collegeName).valueOf()){
                  responseToUser = 'Yes! CSUF has '+collegeName;
                  text = 'Yes! CSUF has '+collegeName;
              }else{
                  responseToUser = 'CSUF does not teach ' +collegeName+' currently';
                  text = 'CSUF does not teach ' +collegeName+' currently';
              }
          }
      }
      else{
          responseToUser = 'No more colleges';
      }
      if (requestSource === googleAssistantRequest) {
          sendGoogleResponse(responseToUser);
      } else {
          sendResponse(text);
      }
  }
2个回答

这是罪魁祸首:

getCollegeData().then(buildSingleCollegeResponse(collegeName))

调用 buildSingleCollegeResponse(collegeName) ,然后将其 返回值 传递到 then ,就像 foo(bar()) 调用 bar 并将其返回值传递到 foo 一样。

您想将一个函数传递给 then

getCollegeData().then(() => buildSingleCollegeResponse(collegeName))
// An arrow function  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

请注意,现在从更新的问题中可以清楚地看出, app.data.collegeData.college 是一个 数组 ,不需要 Object.keys 。更改:

let collegeLength = Object.keys(app.data.collegeData.college).length;

改为

let collegeLength = app.data.collegeData.college.length;

数组具有 length 属性(而非数组对象默认没有该属性)。

T.J. Crowder
2018-03-19

在发出 app.data.collegeData = data; 之前,您尚未提及 app.data 包含什么值

如果 app.data 未定义,您应该尝试 app.data = {collegeData: data

否则否定应用商店。以下作品

app = {};
app.data = {};
app.data.collegeData = data;

app.data.collegeData.college.length

您不需要执行以下操作

let collegeLength = Object.keys(app.data.collegeData.college).length;

更新 :请参阅 https://jsfiddle.net/dmxuum79/3/

ch4nd4n
2018-03-19