#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
от нескольких издателей будут объединены на клиенте. Я бы рекомендовал локальное тестирование с дополнительными пользователями, чтобы убедиться, что вы видите только правильные поля для других пользователей.