Meteor.users публикуют и подписываются не совпадают - PullRequest
0 голосов
/ 19 мая 2018

Я удалил пакет auto-publish из своего приложения Meteor, а также создал публикацию на своем сервере:

Meteor.publish("userData", function () {
    return Meteor.users.find(
            {_id: this.userId},
            {fields: {'profile': 0}}
        );
});

Как вы можете видеть выше, я установил profile на 0 что означает, что я хотел бы исключить это.Однако ...

На моем клиенте у меня есть этот код:

Meteor.subscribe("userData", (param) => {
      console.log( Meteor.users.find(Meteor.userId()).fetch() )
    })

, и на выходе все еще есть профиль:

createdAt: Sat May 19 2018 11:16:25 GMT+0800 (+08) {}
emails: [{…}]
profile: {name: "Second Second"}
services: {password: {…}, resume: {…}}
username: "seconduser"
_id: "ESmRokNscFcBA9yN4"
__proto__: Object
length: 1
__proto__: Array(0)

В чем причина этого?

Ответы [ 3 ]

0 голосов
/ 19 мая 2018

Прежде всего, убедитесь, что вы хотите использовать Meteor.subscribe() или вы хотите использовать this.subscribe().Между ними много различий.

  1. Meteor.subscribe() сохранит подписку неразрушенной при переходе между экранами / маршрутами / пользовательским интерфейсом.
  2. this.subscribe() будет иметь объем подписки до тех пор, пока не будет существовать срок действия Template.Когда вы переключаетесь на другие маршруты / путь / пользовательский интерфейс, подписка будет уничтожена.Это используется в конкретном случае, когда у вас есть несколько видов подписки между последовательными переходами экрана, и возникает проблема с нежелательными данными, отображаемыми в пользовательском интерфейсе, несмотря на фильтрацию в запросе к сбору.

Для получения дополнительной информации, нажмите здесь .

В ответ на ваш точный вопрос, хорошо, когда Метеор узнает, что вы являетесь действительным и вошли в систему, он отправляет целым полям пользователей определенные коллекции _id, emails, profile, username в интерфейсе пользователя.Поэтому рекомендуется помещать в коллекцию пользователей только необходимые данные.Независимо от того, делаете ли вы особую подписку на собственные данные, вы всегда сможете получить доступ к своим собственным данным в пользовательском интерфейсе, даже в производственной сборке.Вы можете проверить, вставив console.log(Meteor.user()); в хромированную консоль.Вот как получается Meteor.user(), нравится вам это или нет.MDG (Meteor Development Group) предположил, что, когда пользователь вошел в систему, пользователь может полностью получить доступ к своим собственным данным в пользовательском интерфейсе, поскольку они безопасны и действительны.

см. Изображение ниже для справки,

enter image description here

0 голосов
/ 19 мая 2018

Вы видите поле profile на клиенте, так как вы уже отредактировали и, таким образом, включили это специальное поле объекта User при создании или обновлении пользователя.Чтобы защитить этот объект от модификаций на стороне клиента, вы можете запретить все записи с клиента со следующим кодом на стороне сервера.

// Deny all client-side updates to user documents
Meteor.users.deny({
    update () { return true; },
});

Таким образом, даже если поле profile доступно наклиент в объекте Meteor.user(), клиент не может вносить изменения.

Если вы публикуете пользовательские данные, вы можете управлять их экспозицией по-своему.Например, давайте предположим, что мы вводим новое поле customProfile в объект пользователя, чем в следующем коде, customProfile не будет виден клиенту.

Meteor.publish("userData", function () {
    console.log('publishing userData with id', this.userId);
    return Meteor.users.find(
            {_id: this.userId},
            {fields: {'customProfile': 0}}
        );
});

Вы можете найти большеинформация в справочнике .

0 голосов
/ 19 мая 2018

Возможно, что какая-то другая подписка подписалась на поле profile пользователя.

Вы можете узнать, так ли это, посмотрев информацию, отправленную черезthe websocket.

  1. Откройте отладчик,
  2. найдите вкладку "сети",
  3. найдите соединение websocket,
  4. найдите содержимое или"frames".

Там вы можете увидеть, какие subs были сделаны и какие обновления сервер публикует до collection.Посмотрите, как это выглядит без вашего сабвуфера;возможно, пользовательский документ уже опубликован.

...