【问题标题】:Publishing Users information but without "secret" fields发布用户信息但没有“秘密”字段
【发布时间】:2014-06-17 21:41:21
【问题描述】:

我发布多用户信息(使用 Meteor.users 集合)是为了命名帖子创建者,并让他们的姓名和其他与这些帖子相关的小细节,但我不想为每个用户发布完整的文档因为他们有“秘密”登录信息。

这是我正在使用的代码:

Meteor.publish("serverforumthread", function(thread){
    check(thread, String);

    var replies = forumReplies.find({thread: thread});
    var users = {};
    replies.map(function(r){
        users[r.owner] = r.owner;
    });
    var userids = _.map(users, function(value, key){ return value; });   
    var projectedFields = {_id:1, username:1, forumStats: 1, services: 0};    
    var usrs = Meteor.users.find({_id:{$in: userids}}, projectedFields);
    var anyUpdateToUsers = false;
    usrs.map(function(owner){
        var changed = false;
        if(!owner.username){
            owner.username = owner.emails[0].address.split("@")[0]; 
            changed = true;
        }
        //owner.forumStats = undefined;
        if(!owner.forumStats){
            owner.forumStats = {};
            owner.forumStats.postCount = 0;
            owner.forumStats.postLikes = 0;
            owner.forumStats.title = "the newbie";
            owner.forumStats.tag = "newbie";
            owner.forumStats.img = "http://placehold.it/122x122";
            changed = true;
        }
        if(changed){
            anyUpdateToUsers = true;
            Meteor.users.update({_id: owner._id}, {$set:{ forumStats:owner.forumStats }});
        }
    });  
    if(anyUpdateToUsers) // refresh it
         usrs = Meteor.users.find({_id:{$in: userids}}, projectedFields);

    usrs.map(function(owner){
        console.log(owner);
    });
    return [replies, usrs];
});

如您所见,我只对发布线程及其关联用户用户名和小型论坛统计的依赖项(帖子)感兴趣,我想保密“服务”密钥,因为它包含不应发布的详细信息.

“console.log”的示例输出:

{ _id: 'hoRYFbRkXXbHYm8Ty',
   createdAt: Tue Jun 03 2014 16:25:42 GMT+0100 (WEST),
   emails: [ { address: 'somemail@gmail.com', verified: false } ],
  forumStats: 
    { postCount: 85,
      postLikes: 5,
      title: 'the newbie',
      tag: 'newbie',
      img: 'http://placehold.it/122x122' },
   services: 
    { password: { srp: [Object] },
      resume: { loginTokens: [Object] } } }

我做错了什么?

谢谢。

【问题讨论】:

    标签: meteor publish


    【解决方案1】:

    查看文档field specifiers 部分中的示例,并尝试一下:

    var projectedFields = {fields: {username:1, forumStats: 1}};
    

    您将免费获得_id,它只会包含您指定的其他字段。请注意,您不能混合包含和排除选项,这意味着您不能同时拥有 0 和 1。

    如果这不起作用,请告诉我,我会更仔细地查看。

    【讨论】:

    • 它似乎不起作用。但是,现在我想起来了,我只是从我自己的“用户”那里读取 cmets,因为现在系统上没有其他人,所以,我可能会从刚登录时获得“额外”字段。编辑:如果我刷新并且不导航到帖子页面(不执行订阅),“额外”服务字段就会消失,因此,我很确定该字段正在发布。
    • 是的,您会自动为您自己的用户获取其他字段,例如您的个人资料。请记住,来自多个发布者的相同_id 的字段将在客户端上合并在一起。我建议在本地与其他用户一起进行测试,以确保您只看到其他用户的正确字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2016-04-29
    • 2017-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 2020-03-26
    相关资源
    最近更新 更多