无法在meteor mongodb应用中显示数据

时间:2014-10-19 11:54:11

标签: meteor

我有一个基于流星排行榜示例的测试应用程序,但是当我创建自己的应用程序时,我无法显示数据,查询也无法正常工作。如果我在终端窗口中运行meteor mongo,我可以看到有数据被插入。

db.games.find();

显示所有游戏。

db.games.remove(); 

删除所有游戏,但不能在我的流星应用程序内部工作。

除插入内容外,此应用程序中没有任何内容可用。

if (Games.find().count() === 0)

总是返回零。

这是我的main.js文件。

var court = 1;

var currentDate = new Date;

var gameDate = new Date("2014-10-19");

var gameTime = new Date("21:15");

var MinutesSinceMidnightNow = (new Date() - new Date().setHours(0,0,0,0)) / 6000;

var MinutesSinceMidnightGameTime = (new Date().setHours(21,15,0,0) - new Date().setHours(0,0,0,0)) / 6000;

Games = new Meteor.Collection("games");

if (Meteor.isClient) {

  Template.game.helpers({
    games: function () {

      return Games.find({});

    }  // players func
  });  //template helpers

 Meteor.startup(function () {
  if (Games.find().count() === 0) {
    Games.insert({
     "court_id": court,
     "game_date": gameDate,
     "court_name": 'Court 1',
     "game_time" : gameTime,
     "team_a": "bulldogs",
     "team_b": "sea eagles",
     "team_a_score": 0,
     "team_b_score": 0,
     "game_duration": 75,
     "game_half": 0,
     "game_quarter": 15,
     "quarter_time": 3,
     "half_time": 5,
     "game_minutes": MinutesSinceMidnightGameTime
     });
   }
 });

}  // isClient

if (Meteor.isServer) {
  Meteor.startup(function () {

  Games.remove();

  });
}

这是我的HTML文件。

<head>
  <meta name="viewport" content="width=device-width, user-scalable=no">
</head>

<body>
  <div class="outer">
    {{> scoresheet}}
  </div>
</body>

<template name="scoresheet">
  <div class="scoresheet">
    {{#each games}}
      {{> game}}
    {{/each}}
  </div>
</template>

<template name="game">
  <div class="game">
  <h1>"Hello"</h1>
    <span class="name">{{game_time}}</span>
    <span class="name">{{court_name}}</span>
    <span class="name">{{team_a}}</span>
    <span class="name">{{team_b}}</span>
    <span class="score">{{team_a_score}}</span>
    <span class="score">{{team_b_score}}</span>
  </div>
</template>

1 个答案:

答案 0 :(得分:0)

你正在陷入竞争状态......

在声明集合Games.find()之后但在集合Games同步之前,查询Games正在运行,因此即使 n <,答案也将为0 / em>&gt; 0

您可以通过在应用程序完全加载时在控制台中运行Games.find().count()来测试是否是这种情况。它应该打印 n

当您希望集合中有文档时,解决方案是将其包装在autorun

Meteor.autorun(function() {
    if(Games.findOne()) {

      //do your stuff here
      }

  });

但是对于 n = 0

的情况,这仍然会失败

因此您可以将其放入计时器并测试DDP._allSubscriptionsReady()

timer = Meteor.setInterval( function(){test();}, 200 );

test = function(){
  if(DDP._allSubscriptionsReady()) action(timer);
};

action = function(timer){
  Meteor.clearInterval(timer);

  /* now do stuff */
  console.log('subs are ready, really ready', Games.find().count())
};

但是,在实际情况中,您应该考虑删除autopublish包并设置发布/订阅,并根据this answer

将代码放入订阅的回调中