【问题标题】:Meteor.user with Additional Fields on ClientMeteor.user 在客户端具有附加字段
【发布时间】:2021-05-28 02:16:12
【问题描述】:

在 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() 调用的默认字段以提供额外的字段?

【问题讨论】:

    标签: meteor meteor-accounts


    【解决方案1】:

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

    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.更新 Meteor 默认为用户发布的字段。

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

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

    【讨论】:

    • 第二个选项Accounts._defaultPublishFields 看起来正是我想要的。不幸的是,我没有看到这个选项,对我来说是undefined。您使用的是什么版本(Meteor、Accounts 等?)
    • 升级到 Meteor 2.0 后(我在 CLI 中提示运行 meteor update),我找到了 Accounts._defaultPublishFields 属性,它允许我将 customField 添加到投影中。对于足够版本的用户来说,这就像一个魅力!
    • 这可能会稍微高效一些,但如果您正在构建生产系统,我会警告不要使用下划线字段。毕竟,它们被标记为私有是有原因的。它们可能随时中断,您甚至不会在流星更新附带的重大更改通知中收到有关它的警告。
    • 如前所述,这被视为私有字段,并且可能会更改。这个人不会阻止我使用这种方法。相反,我会编写一个测试以确保它按预期运行。虽然这只是边际收益,但如果您为成千上万的用户提供服务,那么这些边际收益可能会产生很大的不同。
    • @ChristianFritz - 就安全而言,这是一个公平的观点,但可以通过测试的形式轻松缓解,我不认为浪费网络调用是一件可笑的事情。此外,它是 JavaScript,因此由于该语言的活力,每次调用都存在固有的危险。
    【解决方案2】:

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

    服务器:

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

    客户:

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

    【讨论】:

    • 这确实将字段从服务器获取到客户端。然而,这是因为 Meteor 将最初发布的文档与来自第二次发布的文档的结果合并,这会导致两个查询,不是吗?这有点绕开了问题的意图。
    • 如果不是“我正在发布一个额外的集合”然后是“我正在发布一个额外的数据库更改流”,那么关于文档还有什么更准确的说法?这样会更准确吗?
    猜你喜欢
    • 1970-01-01
    • 2018-02-01
    • 2011-08-23
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多