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

向出版物中的Meteor.users添加计算字段,meteor,Meteor,我正试图在出版物中发布一个自定义计算字段isFriend,该字段从Meteor.user返回一条记录 我尝试了各种解决方案,但没有一种有效: 从发布进行转换无法按此处所述工作 我在这里试过解决办法。。买也不管用。。。请参阅下面的代码 代码: 请告知。转换文档的最简单方法是在您的文档中添加一个transform选项。您可以直接使用meteor API或类似的软件包(有关更多详细信息,请参阅文档) 但是,有时您需要在文档发布之前对其进行转换,因为只有服务器具有必要的信息。签名URL就是一个很好的

我正试图在出版物中发布一个自定义计算字段
isFriend
,该字段从
Meteor.user
返回一条记录

我尝试了各种解决方案,但没有一种有效:

  • 从发布进行转换无法按此处所述工作

  • 我在这里试过解决办法。。买也不管用。。。请参阅下面的代码

代码:


请告知。

转换文档的最简单方法是在您的文档中添加一个
transform
选项。您可以直接使用meteor API或类似的软件包(有关更多详细信息,请参阅文档)

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

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

Meteor.publish('viewProfile',函数(userId){ 检查(用户ID、字符串); //根据需要修改此选项 变量转换=函数(用户){ user.isFriend=true; 返回用户; }; //只发布您真正需要的字段 var字段={用户名:1,电子邮件:1,配置文件:1}; var self=这个; var handle=Meteor.users.find(userId,{fields:fields})。观察({ 新增:功能(用户){ self.added('users',user.\u id,transform(user)); }, 更改:功能(用户){ self.changed('users',user.\u id,transform(user)); }, 删除:函数(用户){ 自删除('users',user.\u id); } }); 这个; this.onStop(函数(){ handle.stop(); }); });
为了防止对其他人有所帮助,我修改了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();

非常感谢@DavidWeldon!
const handle = Meteor.subscribe('viewProfile', userId);

const isLoading = !handle.ready();