2

我有一个用户列表。我不想将所有用户数据发布到客户端,尤其是电子邮件。我有多种发布方法可以使用:

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

但是如果我或其他程序员忘记过滤字段而只发布整个集合怎么办:

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

这是个问题。应该有全局设置来过滤收集中的数据。有什么办法可以在当前(0.6.6.3)流星中做到这一点?

4

2 回答 2

0

You can create a method you use instead of the normal collection.find method that you use anywhere you need to publish users. An example could be:

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

And then you can just remind your programmers to use the findUsers method:

Meteor.publish('userData', function () {
    return findUsers({ points: { $gt: 5 } });
});
于 2013-11-09T17:12:36.160 回答
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();
  });
});
于 2014-01-24T07:11:42.290 回答