Публикация информации о пользователях, но без «секретных» полей

#meteor #publish

#метеор #опубликовать

Вопрос:

Я публикую многопользовательскую информацию (используя Meteor.users collection) с целью присвоения имен создателям сообщений, и их имена и другие мелкие детали связаны с этими сообщениями, но я НЕ хочу публиковать полные документы для каждого пользователя, поскольку у них есть «секретная» информация для входа.

Вот код, который я использую:

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

Как вы можете видеть, меня интересует только публикация ссылок (сообщений) для потока и связанных с ними имен пользователей и небольших forumStats, я хочу сохранить секретный ключ «services», поскольку он содержит детали, которые не должны публиковаться.

Пример вывода «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] } } }
  

Что я делаю не так?

Спасибо.

Ответ №1:

Взгляните на примеры в разделе «спецификаторы полей» документации и попробуйте:

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

Вы получите _id бесплатно, и в него будут включены только те другие поля, которые вы укажете. Обратите внимание, что вы не можете смешивать параметры включения и исключения, что означает, что у вас не может быть как 0, так и 1.

Если это не сработает, дайте мне знать, и я посмотрю более внимательно.

Комментарии:

1. Похоже, это не сработало. Однако теперь, когда я думаю об этом, я читаю комментарии только от своего собственного «пользователя», поскольку в системе сейчас никого нет, поэтому я могу получать «дополнительные» поля, просто войдя в систему. Редактировать: поле «дополнительные» службы исчезает, если я обновляю и не перехожу на страницу публикации (не выполняя подписку), поэтому я почти уверен, что это поле публикуется.

2. Да, вы автоматически получаете другие поля, такие как ваш профиль, для вашего собственного пользователя. Имейте в виду, что поля для одного и того же _id от нескольких издателей будут объединены на клиенте. Я бы рекомендовал локальное тестирование с дополнительными пользователями, чтобы убедиться, что вы видите только правильные поля для других пользователей.