2013-11-09 122 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(); 
    }); 
});