Метеор: публикация всех пользователей клиенту

Почему это не работает?:

На клиенте и сервере:

AllUsers = new Meteor.Collection('allUsers');

Только на сервере:

Meteor.publish('allUsers', function() {
return Meteor.users.find();
});

Только на клиенте:

Deps.autorun(function(){
Meteor.subscribe("allUsers");
});

После запуска этого приложения AllUsers.find(). count() равен нулю, но выполнение db.users.find.count() в терминале дает правильное число (3). Даже после того, как я добавлю нового пользователя в браузер (используя стандартную форму пакета ui-accounts), который, безусловно, должен привести к изменению коллекции пользователей, у меня все еще нет документов в моей коллекции AllUsers. Я бил головой о стену, пытаясь решить это!

Ответ 1

Сбор метеоров, определенный на сервере, имеет отношение 1:1 к коллекциям в базе данных. У вас нет коллекции в БД под названием 'allusers', так что определение не имеет смысла. Похоже, вы смешиваете понятие коллекции базы данных и опубликованный набор результатов.

Когда вы добавляете пакет учетных записей в свой проект, метеорит определяет коллекцию Meteor.users для вас как на клиенте, так и на сервере, поэтому вам не нужно это делать снова. Ваш код выглядит отлично - просто удалите new Meteor.Collection и получите доступ к пользователям через Meteor.users.find.


Объяснение описаний коллекции

Коллекция, созданная для вас пакетом

  • пример: Meteor.users создается пакетом accounts
  • Примечания: коллекция в БД db.users. Вы можете сделать эту коллекцию похожим на другие, которые вы определяете, выполняя что-то вроде Users = Meteor.users, а затем вызывая Users.find() вместо Meteor.users.find().

Коллекции, определенные как на клиенте, так и на сервере

  • пример: new Meteor.Collection('rooms')
  • Примечания: В большинстве проектов это то, что вы делаете почти все время. Строка 'rooms' - это имя коллекции в базе данных (db.rooms). Документы могут быть опубликованы с сервера клиенту.

Коллекции, определенные на клиенте, но не на сервере

Неуправляемый локальный набор, определенный на клиенте

  • пример: new Meteor.Collection(null)
  • Примечания: они определяются, когда клиент хочет иметь семантику коллекции, но не хочет использовать коллекцию для связи с сервером. Типичным примером использования будет демонстрационное приложение, в котором пользователь может играть с интерфейсом, но только изменять данные внутри своего браузера.