2013-05-25 61 views
5

我一直對我的頭撞牆了一段時間,我假設我在這裏錯過了一些簡單的東西。客戶端訂閱無法從Meteor服務器接收數據發佈

我我的流星服務器上運行此:

// --- Collections --- 
Projects = new Meteor.Collection('projects'); 
Team = new Meteor.Collection('team'); 

// --- Only publish user data for users on my team --- 
Meteor.publish('team', function() { 
    var team = Meteor.users.findOne({_id: this.userId}).profile._team; 
    console.log(Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}).fetch()); 
    return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}); 
}); 

此找到所有誰是在同一個「團隊」的網友通過對誰具有相同的ID中的所有用戶文件運行查詢profile._team屬性作爲當前登錄的用戶。你會在發佈函數中看到console.log(...);(在return語句之前的那行),並且它正確地記錄了我期望它在我的終端中的文檔。

現在我爲我的客戶端上運行此:

// --- Data --- 
Meteor.subscribe('team'); 
Team = new Meteor.Collection('team'); 

Template.team.team = function() { 
    console.log(Team.findOne()); 
    return Team.find(); 
}; 

然而,console.log(Team.findOne())始終記錄不確定,Team.find()總是返回一個空數組。我做錯了什麼,阻止我的文檔到達客戶端?

UPDATE:以下是模板代碼。

<body> 
    {{> team}} 
</body> 

<template name="team"> 
    <p>TEAM TEMPLATE WORKS</p> 
    {{#each team}} 
     <p>TEAM EACH WORKS</p> 
     <div class="teamMember"> 
      {{profile.firstName}} {{profile.lastName}} 
     </div> 
    {{/each}} 
</template> 

「隊中的每一作品」永遠不是{{#each}}標籤內呈現,但「TEAM模板工程」呈現時,它被放置在{{#each}}標記之前預期。

+0

的東西就很奇怪。請發佈您的模板代碼。 – Xyand

+0

添加了模板代碼。 –

+0

它有助於瞭解客戶端通常需要使用與服務器相同的集合名稱,但預訂名稱可能完全不同,並且需要與發佈名稱(*不是服務器上的集合名稱)匹配。查看詳情[流星收藏,訂閱和出版物如何工作](http://stackoverflow.com/a/21853298/1269037)。 –

回答

3

這裏的問題是:返回遊標users

Team = new Meteor.Collection('team'); 

但是在服務器發佈功能:

在你指的集合team客戶

return Meteor.users.find({'profile._team': team}, {fields: {_id: 1, profile: 1}}); 

team的文件曾經發表過。實際上,您甚至在服務器代碼中不使用TeamProjects

老答案:

嘗試刪除console.log(teamMates.fetch());或添加teamMates.rewind()

docs

在foreach,地圖或獲取方法只能上的光標一度被稱爲。要多次訪問遊標中的數據,請使用快退來重置遊標。

+0

啊謝謝,我不知道遊標需要重新纏繞。我刪除了調用'fetch()',但不幸的是它仍然沒有解決我的問題。我用我現在使用的代碼更新了我的問題。 –

+0

我想要做的是通過查找具有相同'_team' id的'users'集合中的所有文檔來向用戶顯示其他「用戶」列表中的其他用戶。我不希望用戶看到數據庫中的所有用戶。因此,我編寫了一個名爲「團隊」的已發佈集合,對'用戶'集合運行查詢並返回匹配的文檔。 '團隊'集合並不打算真正存在於磁盤上。這是否是錯誤的方式? –

+0

感謝您的幫助。看起來做一個新的集合是錯誤的方式去做。我終於能夠使用這種方法解決它:http://stackoverflow.com/a/12635270/371273 –

2

隨着流星,訂閱team需要很短的時間。雖然它Team.findOne()會返回undefined,而Team.find()會給出一個空數組。

如果您等待一兩秒鐘,則客戶端上顯示的數據應該匹配。

你確實把你的return Team.find()放在一個模板助手中,它是被動的。因此,只要數據到達客戶端,用戶界面就應該顯示更新的數據,只要您在HTML中使用{{#each team}}幫手

+0

我明白你在說什麼,它是有道理的,因爲它是異步的,但在那裏沒有出現在我的模板中。我用它來證明它不起作用:'{{#each team}} {{log「It works!」}} {{/ each}}'。 當我在模板幫助程序中查詢我的'Projects'集合時,數據會按照我的預期記錄,所以我的困惑是什麼區別?在從用戶數據庫查詢時,它可能是某種Meteor用戶權限?我想我通過製作自己的發佈/訂閱功能來解決這個問題。 –

相關問題