感谢您查看我的问题。对于在生产中使用Meteor的人来说应该很容易,我还处于学习阶段。
所以我的流星设置是我有一堆文件ownedBy
_id' s反映哪个用户拥有每个文档(https://github.com/rgstephens/base/tree/extendDoc是完整的github,请注意它是extendDoc分支,不是主分支)。
我现在想要修改我的API,以便我可以显示文档的每个所有者的真实姓名。在服务器端,我可以使用Meteor.users.findOne({ownedBy})
访问它,但在客户端,我发现由于Meteor安全协议(用户无法访问其他用户的数据),我无法执行此操作。
所以我有两个选择:
以某种方式修改我发布的内容的结果,以在服务器端包含用户的真实姓名
以某种方式将完整的用户数据推送到客户端,并将_id
映射到客户端上的真实姓名
这里的最佳做法是什么?我试过了两个,到目前为止这是我的结果:
publish
限制?谷歌在这个话题上非常沉默。
Meteor.publish('documents.listAll', function docPub() {
let documents = Documents.find({}).fetch();
documents = documents.map((x) => {
const userobject = Meteor.users.findOne({ _id: x.ownedBy });
const x2 = x;
if (userobject) {
x2.userobject = userobject.profile;
}
return x2;
});
return documents; //this causes error due to not being a cursor
}

Meteor.publish('documents.listAll', function docPub() {
return [Documents.find({}),
Meteor.users.find({}),
];
});

我真的想做1,因为我觉得2中有一个很大的安全漏洞,但请告诉我应该怎么做?非常感谢。
答案 0 :(得分:2)
是的,您不想将完整的用户对象发布到客户端。但你可以使用选项上的“字段”发布完整用户对象的子集,这是find()的第二个参数。在我的项目中,我为每个用户创建了一个“公开个人资料”区域;这使我们可以很容易地了解用户可以向其他用户发布的内容。
有几种方法可以将此数据传输到客户端。你已经找到了一个:从发布中返回多个游标。
在下面的示例中,我将返回所有文档,以及拥有这些文档的所有用户对象的子集。此示例假定用户的名称以及您决定的其他任何“公共”信息位于名为publicInfo的字段中,该字段是Meteor.user对象的一部分:
Meteor.publish('documents.listAll', function() {
let documentCursor = Documents.find({});
let ownerIds = documentCursor.map(function(d) {
return d.ownedBy;
});
let uniqueOwnerIds = _.uniq(ownerIds);
let profileCursor = Meteor.users.find(
{
_id: {$in: uniqueOwnerIds}
},
{
fields: {publicInfo: 1}
});
return [documentCursor, profileCursor];
});
答案 1 :(得分:0)
在MeteorChef松弛频道中,@ distalx如此回应:
您好,您正在使用fetch
和fetch
将所有匹配的文档作为数组返回。
我想如果你只是使用find
- w / o fetch
它会这样做。
Meteor.publish('documents.listAll', function docPub() {
let cursor = Documents.find({});
let DocsWithUserObject = cursor.filter((doc) => {
const userobject = Meteor.users.findOne({ _id: doc.ownedBy });
if (userobject) {
doc.userobject = userobject.profile;
return doc
}
});
return DocsWithUserObject;
}
我打算尝试一下。