Meteor.users发布和订阅不匹配

时间:2018-05-19 04:21:51

标签: meteor

我已从Meteor应用程序中删除了auto-publish包,我还在服务器上创建了一个出版物:

Meteor.publish("userData", function () {
    return Meteor.users.find(
            {_id: this.userId},
            {fields: {'profile': 0}}
        );
});

如您所见,我已将profile设置为0,这意味着我想将其排除。然而...

在我的客户端,我有这段代码:

Meteor.subscribe("userData", (param) => {
      console.log( Meteor.users.find(Meteor.userId()).fetch() )
    })

并且输出仍包含配置文件:

createdAt: Sat May 19 2018 11:16:25 GMT+0800 (+08) {}
emails: [{…}]
profile: {name: "Second Second"}
services: {password: {…}, resume: {…}}
username: "seconduser"
_id: "ESmRokNscFcBA9yN4"
__proto__: Object
length: 1
__proto__: Array(0)

这是什么原因?

3 个答案:

答案 0 :(得分:0)

其他一些subscription可能订阅了该用户的profile字段。

通过查看通过websocket发送的信息,您可以了解是否属于这种情况。

  1. 打开调试器,
  2. 找到“网络”标签,
  3. 找到websocket连接,
  4. 找到内容或“框架”。
  5. 在那里,您可以看到已经制作了subs以及服务器发布到collection的更新。看看没有你的潜艇看起来像什么;也许用户文档已经发布。

答案 1 :(得分:0)

首先,确保您要使用Meteor.subscribe()还是要使用this.subscribe()。他们之间有很多不同。

    当您在屏幕/路线/用户界面之间切换时,
  1. Meteor.subscribe()将保持订阅不被销毁。
  2. this.subscribe()将具有订阅范围,直到Template的生命存在。当您切换到其他路由/路径/ UI时,订阅将被销毁。当您在屏幕的连续转换中有多种订阅时会使用此选项,并且尽管在Collection Query中进行了筛选,但UI中显示的不需要的数据也会出现问题。
  3. 要获得更多信息,请click here

    根据您的确切问题,当Meteor知道您是有效且已登录的用户时,它会发送整个用户特定的收集字段_idemailsprofile,{{ 1}}在UI上。因此,建议您仅将所需数据放入User集合中。无论您是否对自我数据进行特殊订阅,您始终都可以在UI上访问自己的数据,即使是在生产版本上也是如此。您可以将username放在Chrome控制台中进行检查。这就是console.log(Meteor.user());的制作方式,无论你喜不喜欢。 MDG(Meteor Development Group)假设当用户登录时,用户可以在UI上完全访问他/她自己的数据,因为它是安全有效的。

    见下图供参考,

    enter image description here

答案 2 :(得分:0)

您在客户端上看到profile字段,因为您已经编辑过,因此在创建或更新用户时启用了User对象的此特殊字段。为了保护此对象不受客户端修改的影响,您可以使用以下服务器端代码拒绝来自客户端的所有写入。

// Deny all client-side updates to user documents
Meteor.users.deny({
    update () { return true; },
});

因此,即使profile字段在Meteor.user()对象内的客户端上可用,也不能由客户端进行修改。

如果是您发布的自定义数据,则可以按照自己的方式控制其展示。例如,我们假设我们在用户对象中引入了一个新字段customProfile,而不是以下代码,客户端将无法看到customProfile

Meteor.publish("userData", function () {
    console.log('publishing userData with id', this.userId);
    return Meteor.users.find(
            {_id: this.userId},
            {fields: {'customProfile': 0}}
        );
});

您可以在guide

中找到更多信息