Я хочу иметь клиентский доступ для определенного набора полей для ВСЕХ пользователей, тогда как я хотел бы иметь доступ к еще большему количеству полей только для текущего пользователя. Как мне начать писать код публикации, чтобы выполнить это?
Публикуйте определенную информацию для Meteor.users и дополнительную информацию для Meteor.user
Ответ 1
Прямо из Документация Метеор:
Meteor.publish("userData", function () {
return Meteor.users.find({_id: this.userId},
{fields: {'other': 1, 'things': 1}});
});
А также:
Meteor.publish("allUserData", function () {
return Meteor.users.find({}, {fields: {'nested.things': 1}});
});
Надеюсь, что это поможет.
Ответ 2
Как упоминалось выше,
Meteor.publish("userData", function () {
return Meteor.users.find({_id: this.userId},
{fields: {'other': 1, 'things': 1}});
});
и
Meteor.publish("allUserData", function () {
return Meteor.users.find({}, {fields: {'nested.things': 1}});
});
Функции публикации будут вытеснять данные из коллекции Пользователи.
Подписка с
Tracker.autorun(function () {
Meteor.subscribe("userData");
Meteor.subscribe("allUserData");
});
И дополнительные данные автоматически войдут в коллекцию Users и будут доступны в объекте Meteor.user()
.
Ответ 3
Моя история с этим:
Я продолжил работу с документацией, но столкнулся с странным поведением.
У меня была функция публикации, где я опубликовал весь профиль и объект электронной почты для текущего пользователя (скажем, userData
) и просто некоторое подмножество для других пользователей (allUserData
).
Когда у меня было -
Meteor.subscribe("allUserData");
Meteor.subscribe("userData");
На стороне клиента сразу после входа пользователя я получил только данные allUserData
. Это означает даже для моего зарегистрированного пользователя (этот пользователь не мог видеть свой собственный адрес электронной почты). Когда обновлен браузер, ошибка была исправлена, и я получил правильный allUserData
для всех пользователей, кроме одного входа в систему, который имеет свой собственный userData
(с указанным адресом электронной почты).
Что интересно, если я изменил последовательность подписки, исправлена ошибка.:
Meteor.subscribe("userData");
Meteor.subscribe("allUserData");
Ввод в Meteor.autosubscribe(function () { })
ничего не изменил.
Наконец, я попробовал поставить эту подписку на Deps.autorun(function() { })
и явно добавить реактивность, и проблема с последовательностью была решена..:
Deps.autorun(function() {
Meteor.subscribe("allUserData", Meteor.userId());
Meteor.subscribe("userData", Meteor.userId());
// or
// Meteor.subscribe("userData", Meteor.userId());
// Meteor.subscribe("allUserData", Meteor.userId());
});
В функции публикации я просто заменяю this.userId
на userId
из параметра.
Со следующей ошибкой, с которой я столкнулся, был, что у меня есть секретный объект systemData в объекте пользователя профиля, который может видеть только администраторов, а не обычных пользователей. Но, хотя правильный набор публиковать функцию с 'profile.systemData': 0
, этот секретный объект мог видеть всех зарегистрированных пользователей, которые рассматривали его объект профиля.
Вероятно, это потому, что мои функции публикации каким-то образом мешали функции публикации в пакете Meteor Account:
// Publish the current user record to the client.
Meteor.publish(null, function() {
if (this.userId) {
return Meteor.users.find(
{_id: this.userId},
{fields: {profile: 1, username: 1, emails: 1}});
} else {
return null;
}
}, /*suppress autopublish warning*/{is_auto: true});
В любом случае я разрешил его с помощью метода Account.onCreateUser()
и добавил systemData рядом с объектом профиля, а не в профиль.
Там начинаются мои другие проблемы:) см. Обратный вызов Meteor.loginWithPassword не предоставляет настраиваемый объект в документе учетных записей пользователей
PS: Если бы я знал это с самого начала, я поместил объект systemData в специальную коллекцию.