从 Express 读取并传输 JSON 文件到 Jade
Read and transmit JSON file from Express to Jade
我是 Express 和 Jade 的新手,无法找到 Jade 告诉我对象未定义的原因。
我有一个 大 JSON 文件 关于一个可收集的纸牌游戏,其结构是:
{
"LEA" : { /* set data */ },
"LEB" : { /* set data */ },
"2ED" : { /* set data */ },
...
}
并且,对于每个集合
"name" : "Nemesis",
"code" : "NMS",
"gathererCode" : "NE",
"oldCode" : "NEM",
"magicCardsInfoCode" : "ne",
"releaseDate" : "2000-02-14"
"border" : "black",
"type" : "expansion",
"block" : "Masques",
"onlineOnly" : false,
"booster" : [ "rare", ... ],
"cards" : [ {}, {}, {}, ... ]
我想遍历卡片数组以获得GETed集并显示一些相关信息。这是我的 cards.js
文件
'use strict';
var express = require('express');
var router = express.Router();
var mtgjson = require('mtgjson');
router.get('/:set?', function(req, res){
var set = req.params.set;
if (set === undefined) {
res.send('respond with a resource');
} else {
mtgjson(function(err, data) {
if (err) return console.log(err);
res.render('cards', { selectedSet : data.set });
});
}
});
module.exports = router;
还有这个玉模板
extends layout
block content
h1 #{selectedSet.name}
ul
each card in selectedSet.cards
li #{card.rarity}
我得到
Cannot read property 'name' of undefined
任何建议将不胜感激,我可能犯了一些愚蠢的错误。
编辑:新信息 ------------------
当我 console.log(data)
得到以下信息时,似乎是正确的:
TOR:
{ name: 'Torment',
code: 'TOR',
magicCardsInfoCode: 'tr',
releaseDate: '2002-02-04',
border: 'black',
type: 'expansion',
block: 'Odyssey',
booster:
[ 'rare',
'uncommon',
...
'common' ],
cards:
[ [Object],
[Object],
[Object],
...
[Object],
[Object],
[Object] ] },
如果我安慰 set
它会给我正确的字符串(在这个例子中是 TOR )。
编辑 2 ----------------------
如果我将整个 data
对象和 set
变量传递给 jade 模板,我可以实现最终结果,但不是最理想的方式。
我做了这样的东西
block content
ul
each val, key in data
if key == set
li #{val.name}
each card in val.cards
p #{card.name}
解决方案----
只是一个愚蠢的错误:我只是搞砸了 属性 访问器。我应该使用 data[set]
而不是 data.set
因为 var set
是文字。
请参阅参考资料 http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.1
您需要使用 selectedSet.cards.rarity
而不是 cards.rarity
。您传递给模板的唯一对象是您的 selectedSet
对象,并且 cards
嵌套在其中。
我在访问属性时使用了错误的表示法。我应该使用方括号表示法,因为 var set
是一个字符串文字,在这种情况下,点表示法不起作用。
See reference
我是 Express 和 Jade 的新手,无法找到 Jade 告诉我对象未定义的原因。 我有一个 大 JSON 文件 关于一个可收集的纸牌游戏,其结构是:
{
"LEA" : { /* set data */ },
"LEB" : { /* set data */ },
"2ED" : { /* set data */ },
...
}
并且,对于每个集合
"name" : "Nemesis",
"code" : "NMS",
"gathererCode" : "NE",
"oldCode" : "NEM",
"magicCardsInfoCode" : "ne",
"releaseDate" : "2000-02-14"
"border" : "black",
"type" : "expansion",
"block" : "Masques",
"onlineOnly" : false,
"booster" : [ "rare", ... ],
"cards" : [ {}, {}, {}, ... ]
我想遍历卡片数组以获得GETed集并显示一些相关信息。这是我的 cards.js
文件
'use strict';
var express = require('express');
var router = express.Router();
var mtgjson = require('mtgjson');
router.get('/:set?', function(req, res){
var set = req.params.set;
if (set === undefined) {
res.send('respond with a resource');
} else {
mtgjson(function(err, data) {
if (err) return console.log(err);
res.render('cards', { selectedSet : data.set });
});
}
});
module.exports = router;
还有这个玉模板
extends layout
block content
h1 #{selectedSet.name}
ul
each card in selectedSet.cards
li #{card.rarity}
我得到
Cannot read property 'name' of undefined
任何建议将不胜感激,我可能犯了一些愚蠢的错误。
编辑:新信息 ------------------
当我 console.log(data)
得到以下信息时,似乎是正确的:
TOR:
{ name: 'Torment',
code: 'TOR',
magicCardsInfoCode: 'tr',
releaseDate: '2002-02-04',
border: 'black',
type: 'expansion',
block: 'Odyssey',
booster:
[ 'rare',
'uncommon',
...
'common' ],
cards:
[ [Object],
[Object],
[Object],
...
[Object],
[Object],
[Object] ] },
如果我安慰 set
它会给我正确的字符串(在这个例子中是 TOR )。
编辑 2 ----------------------
如果我将整个 data
对象和 set
变量传递给 jade 模板,我可以实现最终结果,但不是最理想的方式。
我做了这样的东西
block content
ul
each val, key in data
if key == set
li #{val.name}
each card in val.cards
p #{card.name}
解决方案----
只是一个愚蠢的错误:我只是搞砸了 属性 访问器。我应该使用 data[set]
而不是 data.set
因为 var set
是文字。
请参阅参考资料 http://www.ecma-international.org/ecma-262/5.1/#sec-11.2.1
您需要使用 selectedSet.cards.rarity
而不是 cards.rarity
。您传递给模板的唯一对象是您的 selectedSet
对象,并且 cards
嵌套在其中。
我在访问属性时使用了错误的表示法。我应该使用方括号表示法,因为 var set
是一个字符串文字,在这种情况下,点表示法不起作用。
See reference