我有一个用户列表。我不想将所有用户数据发布到客户端,尤其是电子邮件。我有多种发布方法可以使用:
Meteor.publish('usersData', function() {
return Users.find({}, {
fields: {
emails: 0
}
});
});
但是,如果我或其他程序员忘记过滤字段并只发布整个集合,该怎么办:
Meteor.publish('users', function() {
return Users.find();
});
这是一个问题。应该有全局设置来过滤集合中的数据。在当前(0.6.6.3)Meteor中有什么方法可以做到吗?
答案 0 :(得分:0)
您可以创建一个使用的方法,而不是在发布用户所需的任何位置使用的普通collection.find
方法。一个例子可能是:
function findUsers(query) {
return Meteor.users.find(query || {}, { fields: { emails: 0 } });
}
然后你可以提醒你的程序员使用findUsers
方法:
Meteor.publish('userData', function () {
return findUsers({ points: { $gt: 5 } });
});
答案 1 :(得分: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();
});
});