2017-03-15 9 views
-1

今日のゲームで誰がプレイしているのか、このJSONを使用しているチャンネルを表示したい、しかし、それは私に、このエラーを与え続け:使用しているJSONにオブジェクトが存在しない場合、エラーまたはN/Aを返すには

TypeError: /home/ubuntu/workspace/sportsapp/views/results.ejs:8 
    6| <% data["games"].forEach(function(game){ %> 
    7|  <ul> 
>> 8|   <li><%= game["home"]["name"]%> Vs. <%=game["away"]["name"]%> <%=game["broadcast"]["network"][1]%> 
    9|  
    10| 
    11|   </li> 

Cannot read property 'network' of undefined 
    at eval (eval at <anonymous> (/home/ubuntu/workspace/sportsapp/node_modules/ejs/lib/ejs.js:524:12), <anonymous>:29:42) 
    at Array.forEach (native) 
    at eval (eval at <anonymous> (/home/ubuntu/workspace/sportsapp/node_modules/ejs/lib/ejs.js:524:12), <anonymous>:22:22) 
    at returnedFn (/home/ubuntu/workspace/sportsapp/node_modules/ejs/lib/ejs.js:555:17) 
    at tryHandleCache (/home/ubuntu/workspace/sportsapp/node_modules/ejs/lib/ejs.js:203:34) 
    at View.exports.renderFile [as engine] (/home/ubuntu/workspace/sportsapp/node_modules/ejs/lib/ejs.js:412:10) 
    at View.render (/home/ubuntu/workspace/sportsapp/node_modules/express/lib/view.js:126:8) 
    at tryRender (/home/ubuntu/workspace/sportsapp/node_modules/express/lib/application.js:639:10) 
    at EventEmitter.render (/home/ubuntu/workspace/sportsapp/node_modules/express/lib/application.js:591:3) 
    at ServerResponse.render (/home/ubuntu/workspace/sportsapp/node_modules/express/lib/response.js:960:7) 




<h1>Who's Playing Today!</h1> 
<h2>Mens NCAA CBB</h2> 

<% data["games"].forEach(function(game){ %> 
    <ul> 
     <li><%= game["home"]["name"]%> Vs. <%=game["away"]["name"]%> <%=game["broadcast"]["network"][1]%> 


     </li> 
    </ul> 
<% }); %> 

<% include partials/footer %> 

私は私EJSファイルに表示しようとしていたオブジェクトが

以下のようなJSONのセクションの一部に存在しないので、それがあると仮定しています
{ 
id: "f172b5e1-97d5-4599-a033-fdafeb12de63", 
title: "CBI - First Round - Game 6", 
status: "scheduled", 
coverage: "extended_boxscore", 
scheduled: "2017-03-16T00:05:00+00:00", 
conference_game: false, 
venue: { 
id: "56bfb904-5b8e-4241-bf79-4c02765df0ec", 
name: "Swinney Recreation Center", 
capacity: 2000, 
address: "5030 Holmes St", 
city: "Kansas City", 
state: "MO", 
zip: "64110", 
country: "USA" 
}, 
home: { 
name: "UMKC Kangaroos", 
alias: "UMKC", 
id: "820c8f26-cf11-4997-b2e2-19f47bd2f72f" 
}, 
away: { 
name: "Green Bay Phoenix", 
alias: "GB", 
id: "61a3e5ab-1be3-4694-b83f-edae0953f409" 
} 
}, 
{ 
id: "23ee0924-a55f-4993-a31b-c344f209cd69", 
title: "CBI - First Round - Game 5", 
status: "scheduled", 
coverage: "extended_boxscore", 
scheduled: "2017-03-16T01:00:00+00:00", 
conference_game: false, 
venue: { 
id: "32e70ac7-27f7-4a28-92a4-8584180cf3ca", 
name: "Arena-Auditorium", 
capacity: 15028, 
address: "1000 E University Ave", 
city: "Laramie", 
state: "WY", 
zip: "82071", 
country: "USA" 
}, 
home: { 
name: "Wyoming Cowboys", 
alias: "WYO", 
id: "a7127c0a-a466-47ae-91ad-9a71ee2c9427" 
}, 
away: { 
name: "Eastern Washington Eagles", 
alias: "EWU", 
id: "54df21af-8f65-42fc-bc01-8bf750856d70" 
} 
}, 

この値以外の値は、

です
{ 
id: "e288ca27-4559-4c41-95d2-de8716baca2f", 
title: "Iowa Bracket - First Round - Game 1", 
status: "scheduled", 
coverage: "full", 
scheduled: "2017-03-16T01:00:00+00:00", 
conference_game: false, 
venue: { 
id: "04c2567a-3a02-462b-b06b-5a4216dd30af", 
name: "Carver-Hawkeye Arena", 
capacity: 15400, 
address: "1 Elliot Drive", 
city: "Iowa City", 
state: "IA", 
zip: "52242", 
country: "USA" 
}, 
broadcast: { 
network: "ESPN2", 
satellite: "209", 
internet: "WatchESPN" 
}, 
home: { 
name: "Iowa Hawkeyes", 
alias: "IOWA", 
seed: 1, 
id: "c10544de-e3bd-4776-ba2e-83df8c017fd1" 
}, 
away: { 
name: "South Dakota Coyotes", 
alias: "SDAK", 
seed: 8, 
id: "c946b7ac-5159-4817-93c4-fc9495c6425b" 
} 
}, 
{ 

誰もそれを作る方法を知っていますか?その値を持たないと、それはN/Aを表示し、実際にはチャンネルを表示しますか?

+0

'game.hasOwnProperty( 'network')'は 'false'を返します – surajck

+0

@surajckこれを書いているか、その情報をどうするかについては混乱しています。 – Branduo

答えて

0

これはいくつかの方法で実行できます。

JSONでは、期待しているプロパティを明示的に追加し、JSONにN/Aを文字列プロパティとして追加します。

{ 
... 
network: ["N/A"] /* you can change the structure to whatever you need */ 
... 
} 

あなたはJSONのコントロールに含まれていない場合はデータをマッサージし、あなたがそれを必要とする文字列"N/A"を追加することができ、あなたのjavascript。

let json = fetchJson() 
    .map(d => { 
    if(!d.broadcast) { 
     d.broadcast = {"network": ["N/A"]} // you can put whatever structure you need here 
    } 
    }) 

またはあなたのEJSでテンプレート

<li><%= game["home"]["name"]%> Vs. <%=game["away"]["name"]%> <%=(game["broadcast"] ? game["broadcast"]["network"][1] : "N/A")%> 

EJSテンプレートで三?を追加すると、溶液中の降下を移動するための方法かもしれませんが、どこで前のテンプレートのコンパイルにデータをグルーミングすることです自分のプロジェクトで間違っている傾向があります。

+0

お世話になりました!あなたは三元を意味するものを説明できますか?あなたの例はうまくいきますが、ここで何をしたのかを理解したいと思います。 – Branduo

+0

私は[三項演算子](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)を意味します。基本的には*インラインif文です* –

+0

ありがとう、読んでみよう! – Branduo

0
<li><%= game["home"]["name"]%> Vs. <%=game["away"]["name"]%> <%=game.hasOwnProperty('network') ? game["broadcast"]["network"][1] : "N/A"%> 

これはbroadcastキーを持っているかどうかを確認し、それがない場合は、その後、第二のネットワークを(多分あなたが最初にしたいですか?それはケースの使用[0]の場合)つかむだろう、そうでない場合はN/Aを返します。

+0

これはうまくいきました、あなたの助けてくれてありがとう! – Branduo

+0

これは間違っています。 'game.hasOwnProperty(" network ")'は 'game.network'が存在すれば' true'を返します。** 'game.broadcast.network'が存在すればそうではありません**。 –

0

私はこれがあなたの目的のために十分に簡単であるべきだと思う:

ので、同じように使用
(game.broadcast||{}).network ||"N/A" 

<% data["games"].forEach(function(game){ %> 
    <ul> 
     <li><%= game["home"]["name"]%> Vs. <%=game["away"]["name"]%> <%=(game.broadcast||{}).network||"N/A"%> 

    </li> 
</ul> 

私はネットワークが文字列であり、配列ではないことに気づいたので、実際には2番目の文字を表示したくないと思います。 "ESPN"[1] === "S"

+0

あなたは正しいです、私はそこに1を望んでいませんでした!ご協力いただきありがとうございます! – Branduo

関連する問題