2013-11-09 158 views
2

我有一個用戶列表。我不想將所有用戶數據發佈到客戶端,特別是電子郵件。我有多個發佈的方法,我可以使用:安全用戶電子郵件流星

Meteor.publish('usersData', function() { 
    return Users.find({}, { 
     fields: { 
      emails: 0 
     } 
    }); 
}); 

但如果我或其他程序員忘記過濾領域和剛剛發佈全收:

Meteor.publish('users', function() { 
    return Users.find(); 
}); 

這是一個問題。應該有全局設置來過濾收藏中的數據。目前(0.6.6.3)流星怎麼辦?

回答

0

您可以創建一個您使用的方法,而不是正常的collection.find方法,您可以在任何需要發佈用戶的地方使用該方法。一個例子可以是:

function findUsers(query) { 
    return Meteor.users.find(query || {}, { fields: { emails: 0 } }); 
} 

然後你可以提醒你的程序員使用findUsers方法:

Meteor.publish('userData', function() { 
    return findUsers({ points: { $gt: 5 } }); 
}); 
+0

是的,我做了這樣的事情,但我忘了使用它!我偶然發佈了帶有電子郵件的用戶數據,僅僅是因爲我忘了使用我的函數......我需要Users.find()來默認返回沒有特定字段的數據 - 全局的。當我需要用戶電子郵件時,應該有能力關閉它。 –

+0

@TomášHromník好吧,別忘了用它!真的不應該很困難。如果您需要關閉它,只需瀏覽您的代碼,搜索「users.find」,並確保您正在過濾掉電子郵件.... – BenjaminRH

0

如何寫一個集合觀察者拋出異常每當與當前電子郵件字段用戶已出版。

觀察者爲每個連接的用戶獨立運行,並在用戶對象每次被推送到用戶集合時觸發。如果它不是當前用戶,則在對象包含電子郵件字段時拋出錯誤。

您的團隊在開發過程中應注意到這些例外。

Meteor.publish("userCheck", function() { 
    var self = this; 

    var handle = Meteor.users.find({}).observeChanges({ 
    added: function(id) { 
     var user = Meteor.users.findOne({_id: id}); 
     if (user.emails && self.userId !== id) { 
     throw new Meteor.Error(500, "Must not publish other people's email!"); 
     } 
    } 
    }); 

    self.ready(); 

    self.onStop(function() { 
    handle.stop(); 
    }); 
});