无法从Meteor服务器端接收已发布的Collection

时间:2015-02-26 14:16:24

标签: javascript collections meteor insert publish-subscribe

这是我的问题

我在MeteorisServer和MeteorisClient包装器之外声明了我的收藏。

var Items = new Meteor.Collection("items");

然后我用数组x和数组z插入我的Items Collection。

Items.insert({
             owner: x,
             post_id: z,
             draft: true
           });

console.log(Items.find().fetch())输出到屏幕服务器端时,我在命令行中看到了这一点。

服务器

 { owner:                                                                                                                                                                                                                
   [ 'Sneaker of the Week: \n\nThe women\'s Roshe Flyknit multi-color arrives soon. #roshe http://t.co/1Zfothclmz\n',    

     'Sneaker of the Week:\n\nThe men\'s Roshe Flyknit is now available: http://t.co/frqNCZQbS5 #roshe http://t.co/HOAbnKFUDZ\n',   

       'Modern comfort. The men\'s Roshe Flyknit is now available: http://t.co/zwTWPMpyYK #roshe http://t.co/l7ZLm67sNC\n',     

       'A full-fledged phenomenon, her destiny is to change tennis and the culture, one fallen rival at a time. #techpack http://t.co/TksxyQTUpr\n',                                                                      
    'Her youth conceals an aggressive game of precise strikes and high-tempo performances. #techpack http://t.co/khqgKdZsfv\n',       

      'Always ready, Genie Bouchard is steady crafting her legacy on the tennis court. #techpack http://t.co/U3WTP6Arax\n',                                                                                              
       'Sneaker of the Week:\n\nThe men\'s Dunk CMFT is now available: http://t.co/WFFCBNxICZ http://t.co/OByzzLLdlL\n' ],     


post_id:                                                                                                                                                                                                              
   [ 'http://pbs.twimg.com/media/B-f5AF0IcAAQkZY.jpg',                                                                                                                                                                  
   'http://pbs.twimg.com/media/B-eHJ8tIIAAFUgO.jpg',                                                                                                                                                                  
     'http://pbs.twimg.com/media/B-TZZx7IIAAH9EH.jpg',                                                                                                                                                                  
      'http://pbs.twimg.com/media/B-PBNPkCQAAJq0w.jpg',                                                                                                                                                                  
    'http://pbs.twimg.com/media/B-O_zjaCUAEb6Fj.jpg',                                                                                                                                                                  
    'http://pbs.twimg.com/media/B-O9HhQCAAAIxHM.jpg',                                                                                                                                                                  
    'http://pbs.twimg.com/media/B-ApJnQIgAQisgR.jpg' ],                                                                                                                                                                
   draft: true,                                                                                                                                                                                                          
   _id: '3GW4oqzNHZw9p6yLQ' },              

然后我在服务器端发布这个

// Publish the logged in user's posts
Meteor.publish("posts-recent", function () {
  return Items.find({ owner: x });
});

客户端

然后在客户端收到它。

Meteor.subscribe('posts-recent');
var newItems = Items.find();
console.log(newItems);

控制台

不幸的是,这只是输出对文件开头声明的空集合的引用。我的客户端似乎根本无法接收这些数据。此外,当我在控制台检查器中搜索项目时,我被告知它是未定义的。如果我使用发布和订阅的方式有任何问题,那么有没有人知道呢?

1 个答案:

答案 0 :(得分:2)

Meteor.subscribe是一个客户端API,因此它是异步的,因为客户端代码无法阻止主线程,直到您的数据进入浏览器。

尝试使用此变通方法代码,引入将在订阅标记为就绪时触发的回调:

Meteor.subscribe('posts-recent',function(){
  var newItems = Items.find();
  console.log(newItems);
});

这是Meteor初学者经常面临的常见错误,有许多可用的解决方案可确保您的代码仅在订阅数据可用时运行,最受欢迎的解决方案可能是iron:router与{ {1}}订阅选项。

您可以选择存储订阅句柄并跟踪何时激活就绪状态:

waitOn