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

时间:2017-03-13 00:08:08

标签: javascript mongodb meteor

感谢您查看我的问题。对于在生产中使用Meteor的人来说应该很容易,我还处于学习阶段。

所以我的流星设置是我有一堆文件ownedBy _id' s反映哪个用户拥有每个文档(https://github.com/rgstephens/base/tree/extendDoc是完整的github,请注意它是extendDoc分支,不是主分支)。

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

所以我有两个选择:

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

  2. 以某种方式将完整的用户数据推送到客户端,并将_id映射到客户端上的真实姓名

  3. 这里的最佳做法是什么?我试过了两个,到目前为止这是我的结果:

    1. 我在这里失败了。这非常“节点”。以为我知道。我可以在客户端访问用户数据,但Meteor坚持认为我的出版物必须返回游标而不是JSON对象。如何将JSON对象转换为游标或以其他方式绕过此publish限制?谷歌在这个话题上非常沉默。
    2. 
      
          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
         }
      
      
      

      1. 我在这里取得了成功,但我怀疑是以一个巨大的安全漏洞为代价的。我只是将我的发布修改为一个游标数组,如下所示:
      2. 
        
            Meteor.publish('documents.listAll', function docPub() { 
              return [Documents.find({}),
                Meteor.users.find({}),
              ];
            });
        
        
        

        我真的想做1,因为我觉得2中有一个很大的安全漏洞,但请告诉我应该怎么做?非常感谢。

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如此回应:

您好,您正在使用fetchfetch将所有匹配的文档作为数组返回。 我想如果你只是使用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;
}

我打算尝试一下。