将计算字段添加到出版物中的Meteor.users

时间:2014-08-27 05:01:23

标签: meteor

我正在尝试在发布中发布自定义计算字段isFriend,该字段从Meteor.user返回记录。

我尝试了各种解决方案,但没有一个能够发挥作用:

代码:

Meteor.publish("viewProfile", function(id) {
  console.log("Finding the user: " + id);
  var self = this;
  Meteor.users
      .find({"_id": id})
      .forEach(function(entry) {
          entry.isFriend = true;  // this function changes the content of entry
          self.added("Meteor.users", entry._id, entry);
      });
    self.ready();
});

请告知。

1 个答案:

答案 0 :(得分:5)

转换文档的最简单方法是向collection添加transform选项。您可以使用meteor API直接执行此操作,也可以使用collection-helpers之类的包执行此操作(有关详细信息,请参阅文档)。

但是,有时您需要在文档发布之前对其进行转换,因为只有服务器具有必要的信息。一个很好的例子是签名的URL。在这种情况下,您可以使用observeobserveChanges来操作每个对象。

observeChanges效率更高,但它只能对部分文档进行操作(例如,如果您想要转换已存在的单个字段)。在您的示例中,您需要查看整个文档才能添加字段,因此您需要observe。试试以下内容:

Meteor.publish('viewProfile', function(userId) {
  check(userId, String);

  // modify this as needed
  var transform = function(user) {
    user.isFriend = true;
    return user;
  };

  // only publish the fields you really need
  var fields = {username: 1, emails: 1, profile: 1};

  var self = this;

  var handle = Meteor.users.find(userId, {fields: fields}).observe({
    added: function (user) {
      self.added('users', user._id, transform(user));
    },

    changed: function (user) {
      self.changed('users', user._id, transform(user));
    },

    removed: function (user) {
      self.removed('users', user._id);
    }
  });

  this.ready();

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