将计算字段添加到发布中的Meteor.users中

问题描述 投票:3回答:2

我正在尝试在发布中发布自定义计算字段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();
});

请告知。

meteor
2个回答
6
投票

最简单的转换文档的方法是在transform中添加collection选项。您可以直接使用流星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();
  });
});

0
投票

以防万一,对其他人有所帮助,我修改了David Weldon的答案以返回句柄,以便客户端可以测试订阅是否准备就绪。像这样的东西:

在publish.js中:

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({_id: userId}, {fields: fields})

  const subsription = handle.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() {
    subsription.stop();
  });

  return handle;
});

现在可以在客户端中执行:

const handle = Meteor.subscribe('viewProfile', userId);

const isLoading = !handle.ready();
© www.soinside.com 2019 - 2024. All rights reserved.