2014-01-07 54 views
0

我試圖從用戶集合發佈「朋友」。每個賬戶都有一個保存所有朋友ID(稱爲地址簿)的字段。但是發佈不起作用我只能獲取我自己的帳戶(如非管理員),例如如果我在控制檯上調用Meteor.users.find()。fetch()。如果我這樣做,控制檯上方的方法會記錄以下內容:流星:從自己的帳戶從外地發佈用戶

I20140107-17:22:38.492(1)? --------------------------------------- [object Object]
I20140107-17: 22:38.497(1)? [{_id:'X6XXyD64AW4CvXG6m',
I20140107-17:22:38.498(1)? createdAt:Tue Jan 07 2014 17:10:43> GMT + 0100(CET)
I20140107-17:22:38.498(1)?電子郵件:[[Object]],
I20140107-17:22:38.498(1)?服務:{password:[Object],resume: [Object]},
I20140107-17:22:38.499(1)?用戶名:

服務器:

Meteor.publish("users", function(){ 
    if (Roles.userIsInRole(this.userId, ["admin"])) 
     return Meteor.users.find(); 
    else 
     return Meteor.users.find({_id : this.userId}, {fields: {username: 1, id_:1, emails:1, addressbook:1, createdAt:1}}); 
}); 

Meteor.publish("friends", function(){ 
    var addressbook = Meteor.users.find({_id: this.userId}, {limit:1} , {fields: {addressbook:1}}); 
    console.log("---------------------------------------" + addressbook); 
    console.log(addressbook.fetch()); 

    //return Meteor.users.find({_id :{ $in : addressbook}}, {fields : {username:1, emails: 1}}); 

客戶:

Deps.autorun(function() { 
    Meteor.subscribe("friends"); 
    Meteor.subscribe("users"); 
}); 
'測試'}]

所以沒有通訊錄呈現

這裏我的代碼片段

我如何發佈用戶這些存儲在他們的ID到字段地址簿(或至少他們的電子郵件和用戶名)?有沒有更好的方法來結合發佈?

在此先感謝!

回答

0

有幾件事情錯了你friends發佈功能:

  1. 你並不真的需要limit獲取一個文檔時 - 只需使用findOne
  2. options對於find是單個對象。所以你想要:{limit: 1, fields: {addressbook: 1}}
  3. 一個文件必須被提取(或者你必須使用findOne)才能訪問它的值。
  4. fetch是在遊標上可用的函數(find的結果)。 addressbook只是一個數組。

看起來你是在正確的軌道上。這給一試:

Meteor.publish('friends', function() { 
    var addressbook = Meteor.users.findOne(this.userId).addressbook || []; 
    return Meteor.users.find({_id: {$in: addressbook}}, {fields: {username: 1, emails: 1}}); 
}); 

然而,值得一提的是,friends不會反應,如果addressbook變化。爲此你需要一個反應式連接。請參閱this問題。

+0

感謝您的建議。我已經嘗試過這種方式,但它會在服務器端引發異常(複製您的代碼),請參閱完整日誌:http://pastebin.com/0EB4bMZF 我使用了console.log(addressbook);並且它顯示地址簿始終未定義:/ – kerosene

+0

如果未定義「地址簿」,則會出現錯誤。我修改了代碼來處理這種情況。如果提取沒有返回帶有「地址簿」的文檔,則用戶未登錄或用戶文檔沒有「地址簿」。檢查'this.userId'是否有效,並用'meteor mongo'在控制檯上打開數據庫連接。當db連接打開時,運行'db.users.findOne(userId)',其中userId是你從上面獲得的。看看文件是否有「地址簿」。如果沒有,那麼它就沒有被設置,這在這個問題的範圍之外。 –

+0

謝謝!現在一切順利!地址簿中有一箇舊的id-entry(不再存在),這是造成異常的原因。 – kerosene