Je suis nouveau dans Express et Jade, je ne trouve pas pourquoi Jade me dit que l'objet n'est pas défini. J'ai un gros fichier JSON sur un jeu de cartes à collectionner, dont la structure est:

{
"LEA" : { /* set data */ },
"LEB" : { /* set data */ },
"2ED" : { /* set data */ },
...
}

Et, pour chaque ensemble

              "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" : [ {}, {}, {}, ... ]  

Je souhaite parcourir le tableau de cartes pour un ensemble GETed et afficher des informations sur. Ceci est mon fichier 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;

Et c'est le modèle de jade

extends layout

block content
  h1 #{selectedSet.name}
  ul
  each card in selectedSet.cards
    li #{card.rarity}

Je suis en train

Cannot read property 'name' of undefined

Toute suggestion sera très appréciée, je fais probablement une erreur stupide.

EDIT: Nouvelles informations ------------------

Quand je console.log(data) j'obtiens ce qui suit, cela me semble correct:

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] ] },

Et si je console set Cela me donne la bonne chaîne (TOR dans cet exemple).

Modifier 2 -------------------------

Si je passe tout l'objet data et la variable set au modèle jade, je peux obtenir le résultat final mais d'une manière très sous-optimale. J'ai fait quelque chose comme ça

block content
  ul
    each val, key in data
      if key == set
        li #{val.name}
          each card in val.cards
            p #{card.name}

SOLUTION ----

Juste une erreur stupide: j'ai juste foiré avec les accesseurs de propriété. Je devrais utiliser data[set] au lieu de data.set car var set est un littéral. Voir la référence http://www.ecma-international.org/ ecma-262 / 5.1 / # sec-11.2.1

0
Alessio Breviglieri 5 janv. 2016 à 13:52

2 réponses

Meilleure réponse

J'utilisais la mauvaise notation pour accéder aux propriétés. Je devrais utiliser la notation entre crochets car le var set est une chaîne littérale, dans ce cas, la notation par points ne fonctionnera pas. Voir la référence

0
Alessio Breviglieri 7 janv. 2016 à 00:29

Vous devez utiliser selectedSet.cards.rarity au lieu de cards.rarity. Le seul objet que vous transmettez au modèle est votre objet selectedSet, et cards est imbriqué dans celui-ci.

0
Catherine Gracey 5 janv. 2016 à 21:24