Meteor users发布订阅不匹配:排除profile字段仍显示问题咨询
问题原因分析
你遇到的这个情况是Meteor的内置默认行为导致的:当前登录用户的基础数据(包括profile、username、emails等字段)会自动同步到客户端,不需要通过你自定义的发布订阅来获取。
也就是说,你在userData发布里排除profile字段的操作,只影响这个自定义发布传递的数据,但客户端早就通过Meteor的内置机制拿到了profile字段的数据,所以即使你订阅了自己的发布,控制台输出里依然会显示profile。
解决方案
根据你的需求,有两种常见的处理方式:
1. 完全自定义当前用户的同步数据(推荐)
如果你想彻底控制客户端能拿到的当前用户字段,可以重写Meteor的默认用户发布(一个名称为null的自动订阅发布)。在服务端添加以下代码:
// 服务端 Meteor.publish(null, function () { if (this.userId) { // 这里指定你允许客户端获取的字段,排除profile return Meteor.users.find(this.userId, { fields: { profile: 0, username: 1, emails: 1 } }); } else { return this.ready(); } });
这个发布会自动被所有客户端订阅,覆盖Meteor原来的默认行为,这样客户端就不会再自动获取profile字段了。
2. 客户端手动过滤(临时方案)
如果只是临时需要在输出时隐藏profile,可以在客户端查询时手动指定排除这个字段,但这种方式只是前端层面的过滤,数据其实还是存在于客户端的Minimongo中:
// 客户端 Meteor.subscribe("userData", () => { const user = Meteor.users.find(Meteor.userId(), { fields: { profile: 0 } }).fetch(); console.log(user); });
另外要注意:你的订阅回调里直接fetch()整个用户文档时,会拿到Minimongo中存储的所有用户数据(包括默认同步的profile),所以如果要看到自定义发布的实际效果,要么在find时指定排除字段,要么用服务端方案彻底控制同步的数据范围。
内容的提问来源于stack exchange,提问作者preston
相关产品推荐
相关产品推荐

