Javascript Meteor:使用用户数据修改文档数据的最佳实践

Javascript Meteor:使用用户数据修改文档数据的最佳实践,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,谢谢你看我的问题。对于任何在制作中使用过Meteor的人来说,这应该很容易,我仍处于学习阶段 因此,我的meteor设置是,我有一堆文档,它们的所有者是\u id反映了每个文档的所有者是哪个用户(是完整的github,请注意,它是extendDoc分支,而不是主分支) 现在我想修改我的API,以便显示文档每个所有者的真实姓名。在服务器端,我可以使用Meteor.users.findOne({ownedBy})访问此功能,但在客户端,我发现由于Meteor安全协议(用户无权访问其他用户的数据),我

谢谢你看我的问题。对于任何在制作中使用过Meteor的人来说,这应该很容易,我仍处于学习阶段

因此,我的meteor设置是,我有一堆文档,它们的
所有者是
\u id反映了每个文档的所有者是哪个用户(是完整的github,请注意,它是extendDoc分支,而不是主分支)

现在我想修改我的API,以便显示文档每个所有者的真实姓名。在服务器端,我可以使用Meteor.users.findOne({ownedBy})
访问此功能,但在客户端,我发现由于Meteor安全协议(用户无权访问其他用户的数据),我无法访问此功能

所以我有两个选择:

  • 以某种方式修改我发布的内容的结果,以便在服务器端包含用户的真实姓名

  • 以某种方式将完整的用户数据推送到客户端,并将
    \u id
    映射到客户端的真实姓名

  • 这里的最佳实践是什么?我已经尝试了这两种方法,以下是我迄今为止的结果:

  • 我在这里失败了。我知道这是一种非常“节点”的思维。我可以在客户端访问用户数据,但Meteor坚持我的发布必须返回游标,而不是JSON对象。如何将JSON对象转换为游标或绕过此
    publish
    限制?谷歌在这个话题上出奇地沉默
  • Meteor.publish('documents.listAll',函数docPub(){ 让documents=documents.find({}).fetch(); documents=documents.map((x)=>{ const userobject=Meteor.users.findOne({u id:x.ownedBy}); 常数x2=x; if(用户对象){ x2.userobject=userobject.profile; } 返回x2; }); return documents;//这会由于不是游标而导致错误
    }
    是的,您不想将完整用户对象发布到客户端是对的。但是您当然可以使用选项上的“字段”发布完整用户对象的子集,这是find()的第二个参数。在我的项目中,我创建了一个“公共配置文件”每个用户上的区域;这使得我们可以很容易地知道关于一个用户的哪些信息可以发布给其他用户

    有几种方法可以将此数据发送到客户端。您已经找到了一种方法:从发布返回多个游标

    在下面的示例中,我将返回所有文档以及拥有这些文档的所有用户对象的子集。此示例假定用户名以及您确定为“public”的任何其他信息位于名为publicInfo的字段中,该字段是Meteor的一部分。用户对象:

    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];
    });
    

    在流星频道,@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;
    }
    

    我要试试这个。

    你的例子做得很好,像我这样的小飞象马上就能理解。谢谢!所以在你的例子中,你已经详细说明了我在客户端进行用户数据映射时应该做什么。我分别收到了另一个可能有助于服务器端映射的答案(如下)我将尝试一下。不管怎样,还是向上投票你的。将你标记为正确答案,因为我正在探索的另一条路线没有任何结果。不起作用。游标对象没有筛选器方法:因此我得到了类型错误:游标。筛选器不是函数