2015-12-27 3 views
0

Я, очевидно, не понимаю систему публикации/подписки.Метеор опубликовать/подписаться вопрос

Я удалил небезопасные/автоматически опубликованные пакеты.

В моем сервере/publish.js у меня есть:

Meteor.publish("profiles", function() { 
    return Meteor.users.find({}, { 
     profile: 1, 
     status: 1, 
     services: 0 
    }); 
}); 

В моих клиентов/Lib/collection.js у меня есть:

Meteor.subscribe("profiles"); 
Profiles = new Mongo.Collection("profiles"); 

Теперь, что я ожидал был иметь профили сбор на клиенте, который содержит только профиль и статусные части пользовательского документа и не содержит часть услуг (которая подтверждает информацию, такую ​​как электронная почта и т. д.).

Однако на клиенте коллекция профилей пуста, а Meteor.users() доступна и имеет все в ней, так что любой, кто знает, как открыть консоль, может видеть личные данные обо всех пользователях ...

Кто-нибудь знает, что я делаю неправильно здесь?

EDIT: Интересно, что когда я извлекаю публиковать профили полностью, то на клиентской стороне Meteor.users имеет только текущий пользователь в нем, и только ее часть profile. Теперь я совершенно смущен.

+0

Если пользователь вошел в систему, независимо от того, что произойдет, данные будут опубликованы на клиенте (только данные этого пользователя). ваш метод публикации работает так, как ожидалось. в двух словах, собственные данные пользователя публикуются автоматически метеоритом. –

+0

Я не понимаю вашего ответа? Вы прочитали мой вопрос? Как моя публика работает правильно, когда a) коллекция профилей пуста на клиенте и b) на коллекции Meteor.users() на клиенте есть ВСЕ клиент и их личные данные? –

+0

Meteor.users(). Find() возвращает документы, подписанные на клиенте. если вы удаляете автообновление, обычно нет данных для получения данных. Возможно, у вас есть другой код, который отвечает. –

ответ

1

UPS, Meteor .find синтаксис немного отличается от стандартного mongodb .find синтаксис. Мне нужно было добавить ключевое слово "fileds", а затем оно работает так, как ожидалось.

(почти, так как моя коллекция Профили еще пуста на клиенте ...?)

Meteor.publish("profiles", function() { 
    return Meteor.users.find({}, { 
     fields: { 
      "services": 0 
     } 
    }); 
}); 

EDIT: Ok, благодаря тайскому Tran я, наконец, понял, что на самом деле я DID неправильно понять система публикации/подписания. Я ошибочно думал, что опубликованное «имя» на сервере будет именем коллекции на клиенте. Теперь, когда я понимаю, как это работает, понятно, почему моя коллекция профилей пуста.

+0

Ваша коллекция профилей ничего не связана с вашей коллекцией пользователей. Это две совершенно разные коллекции. Когда вы публикуете свои данные, корневая коллекция будет доступна на стороне клиента, например, в коллекции пользователей. Если вы хотите иметь коллекцию профилей в своей системе, вам нужно изменить способ сохранения пользователя и профиля (например, отношения «один ко многим» в старой структуре базы данных), а затем опубликовать коллекцию профилей на основе идентификатора пользователя. –

+0

. Я думаю Я, наконец, понимаю.Я был под неправильным впечатлением, что публикация «имя» определяет имя коллекции, которое используется на клиенте, но теперь я вижу, как и почему у меня была неправильная идея. Благодаря! –

Смежные вопросы