2017-12-30 51 views
1

を使用してページ上で表示するために取得する私にはわからない:以下のスニペットのコードは「generateSkillData」関数内にこのエラーを返す理由をJSONはJavaScriptを

Uncaught TypeError: Cannot read property 'forEach' of undefined 
    at generateSkillData (script.js:54) 
    at loadingDone (script.js:45) 
    at XMLHttpRequest.request.onload (script.js:24) 

ではなく結果を表示skills.json(1つのオブジェクトの例として以下を参照):

[ 
{ 
    "skill": "Python", 
    "description": "An increasingly popular server-side language" 
} 
] 

私は非常に似ており、正常に動作他のコードを持っています。私はそのコードから多くの機能を借用しました。

function getSkillData(errorFunc, successFunc) { 
 
    let request = new XMLHttpRequest(); 
 
    request.open("GET", "js/skills.json", true); 
 
    request.onload = function() { 
 
    if (request.status >= 200 && request.status < 400) { 
 
     console.log("Success! The call worked!"); 
 
     const data = request.responseText; 
 

 
     successFunc(data); { 
 
     console.log("Error: no data available"); 
 
     } 
 
    }; 
 
    request.onerror = function errorFunc() { 
 
     errorFunc(); 
 
    }; 
 
    }; 
 

 
    request.send(); 
 
} 
 

 
function loadingDone(data) { 
 
    console.log("LOADING DONE"); 
 
    skill_box.innerHTML = ""; 
 
    const finished_markup = generateSkillData(data); 
 
    const skill_container = document.getElementById("skill_box"); 
 
    skill_container.insertAdjacentHTML("beforeend", finished_markup); 
 
}; 
 

 

 
function generateSkillData(response) { 
 
    let skill_markup = ""; 
 
    response.data.forEach(function(thing) { 
 
    skill_markup += formatSkillData(thing); 
 
    }); 
 
    return skill_markup; 
 
} 
 

 
function formatSkillData(item) { 
 
    const markup = ` 
 
     <ul> 
 
      <li>${item.skill}</li> 
 
      <li>${item.description}</li> 
 
     </ul>`; 
 
    return markup; 
 
} 
 

 
function loadingError() { 
 
    console.log("Error loading skills: try again later"); 
 
    document.body.insertAdjacentHTML("beforeend", "<strong>An error occured, please try again later</strong>"); 
 
}; 
 

 

 
(function init() { 
 
    getSkillData(loadingError, loadingDone); 
 
})()
<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta http-equiv="X-UA-Compatible" content=""> 
 
    <title></title> 
 
    <meta name="description" content=""> 
 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
 
</head> 
 

 
<body> 
 

 
    <form id="user_form"> 
 
    <label class="user_input_label" for="link">Skill name:</label> 
 
    <input type="text" name="skill" value="" placeholder="Enter a skill..." id="skill"> 
 
    <label class="user_input_label" for="price">Skill description:</label> 
 
    <input type="text" name="description" value="" placeholder="Description..." id="description"> 
 
    <input class="submit_button" type="submit" value="Submit"> 
 
    </form> 
 

 
    <section id="skill_box"> 
 

 
    </section> 
 

 
</body> 
 

 
<script src="js/script.js"></script> 
 

 
</html>

+0

'generateSkillData'の' response'は文字列です – Andreas

+0

この構文は何ですか: 'successFunc(data); {console.log( "エラー:データがありません"); } '? – Andreas

+0

わかりませんが、実際は申し訳ありません – arw89

答えて

1

あなたの応答をJSONに解析する必要があります。

JSON.parse(response); 

それぞれの呼び出しの直前に挿入します。 それを繰り返すことで、特定のオブジェクトを取得することができます。

0
const data = JSON.parse(request.responseText); 

を追加しましたJSON.parseここにconsole.logを利用した後、応答

function generateSkillData(response){ 
    let skill_markup = ""; 
    console.log(response); 
    response.forEach(function (thing) { 
     skill_markup += formatSkillData(thing); 
    }); 
    return skill_markup; 
} 

上にconsole.logを利用した後、私はどのように考え出しましたそれを行う

関連する問題