【问题标题】:Read and transmit JSON file from Express to Jade从 Express 读取 JSON 文件并将其传输到 Jade
【发布时间】:2016-04-09 04:09:19
【问题描述】:

我是 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 set并显示一些相关信息。这是我的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 是否有一个名为#name 的属性? data.set 究竟返回了什么?
  • 是的,每组都有一个包含“名称”的属性(见上文)。 data.set 应该返回一个具有上面列出的属性的对象(参见“每个集合”等)。事实是,如果我使用 data.LEA (其中 LEA 是 se 对象的“键”),它可以正常工作。 Intead,如果我使用data.set,它告诉我undefined(设置变量已正确分配给LEA,我检查了它)。
  • 错误无法读取属性,就是这样。确保当您说 data.set 时,它会返回您所期望的。该错误不是玉或明示错误。如上所述,数据的返回值不显示数据的#set 属性。所以 data.set 将是未定义的。只渲染 res.render('cards', { selectedSet : data });没有集合。
  • 我使用了错误的符号来访问属性,点而不是方括号。感谢您提供有用的建议。

标签: json express pug


【解决方案1】:

您需要使用selectedSet.cards.rarity 而不是cards.rarity。您传递给模板的唯一对象是您的 selectedSet 对象,cards 嵌套在其中。

【讨论】:

  • 我发现这只是属性访问器的错误,我应该使用方括号表示法。谢谢。
【解决方案2】:

我使用错误的符号来访问属性。我应该使用方括号表示法,因为 var set 是字符串文字,在这种情况下,点表示法不起作用。 See reference

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-29
    • 2014-10-15
    • 2022-01-21
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2017-08-21
    相关资源
    最近更新 更多