我已从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)
这是什么原因?
答案 0 :(得分:0)
其他一些subscription可能订阅了该用户的profile
字段。
通过查看通过websocket发送的信息,您可以了解是否属于这种情况。
在那里,您可以看到已经制作了subs
以及服务器发布到collection
的更新。看看没有你的潜艇看起来像什么;也许用户文档已经发布。
答案 1 :(得分:0)
首先,确保您要使用Meteor.subscribe()
还是要使用this.subscribe()
。他们之间有很多不同。
Meteor.subscribe()
将保持订阅不被销毁。this.subscribe()
将具有订阅范围,直到Template
的生命存在。当您切换到其他路由/路径/ UI时,订阅将被销毁。当您在屏幕的连续转换中有多种订阅时会使用此选项,并且尽管在Collection Query中进行了筛选,但UI中显示的不需要的数据也会出现问题。要获得更多信息,请click here。
根据您的确切问题,当Meteor知道您是有效且已登录的用户时,它会发送整个用户特定的收集字段_id
,emails
,profile
,{{ 1}}在UI上。因此,建议您仅将所需数据放入User集合中。无论您是否对自我数据进行特殊订阅,您始终都可以在UI上访问自己的数据,即使是在生产版本上也是如此。您可以将username
放在Chrome控制台中进行检查。这就是console.log(Meteor.user());
的制作方式,无论你喜不喜欢。 MDG(Meteor Development Group)假设当用户登录时,用户可以在UI上完全访问他/她自己的数据,因为它是安全有效的。
见下图供参考,
答案 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。
中找到更多信息