Подтвердить что ты не робот

Публикуйте определенную информацию для Meteor.users и дополнительную информацию для Meteor.user

Я хочу иметь клиентский доступ для определенного набора полей для ВСЕХ пользователей, тогда как я хотел бы иметь доступ к еще большему количеству полей только для текущего пользователя. Как мне начать писать код публикации, чтобы выполнить это?

4b9b3361

Ответ 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 в специальную коллекцию.