Meteor.user 客户端有附加字段

Meteor.user with Additional Fields on Client

在 Meteor 中,可以像这样将附加字段添加到新用户文档的根级别:

// See: https://guide.meteor.com/accounts.html#adding-fields-on-registration
Accounts.onCreateUser((options, user) => 
  // Add custom field to user document...
  user.customField = "custom data";

  return user;
});

在客户端,可以像这样检索有关当前用户的一些数据:

// { _id: "...", emails: [...] }
Meteor.user()

默认情况下,返回的用户不存在customField。如何通过 Meteor.user() 调用检索该附加字段,以便我们获得 { _id: "...", emails: [...], customField: "..." }?目前,publishing custom data 上的文档似乎建议发布一个额外的集合。由于代码和流量的开销,这是不希望的。是否可以覆盖 Meteor.user() 调用的默认字段以提供其他字段?

您实际上误解了文档。它并不建议填充和发布一个单独的集合,只是一个单独的出版物。那不一样。您可以有多个 publications/subscriptions 都提供同一个集合。所以你需要做的就是:

服务器:

Meteor.publish('my-custom-user-data', function() {
  return Meteor.users.find(this.userId, {fields: {customField: 1}});
});

客户:

Meteor.subscribe('my-custom-user-data');

您有几个解决方案可以用来解决这个问题。

  1. 空出版物
Meteor.publish(null, function () {
  if (this.userId !== null) {
    return Meteor.users.find({ _id: this.userId }, { fields: { customField: 1 } });
  } else {
    return this.ready();
  }
}, { is_auto: true });

这会给你想要的结果,但也会导致额外的数据库查找。虽然这不是通过 _id 并且非常有效,但我仍然认为这是不必要的开销。

2.Updating Meteor 默认为用户发布的字段。

Accounts._defaultPublishFields.projection = { customField: 1, ...Accounts._defaultPublishFields.projection };

这必须在任何 Meteor.startup 块的 运行 之外。如果 运行 在一个之内,这将不起作用。此方法不会导致对您的数据库的额外调用,是我完成此操作的首选方法。