Проблема с доступом к подпискам в Meteor

Я расстраиваюсь из-за ошибки «Исключение в помощнике по шаблону» в приложении Meteor, которое я пытаюсь разработать.

В /lib/collections.js у меня есть:

Categories = new Meteor.Collection("categories");
Venues = new Meteor.Collection("venues");
VenuesAndUsers = new Meteor.Collection("venuesAndUsers");

В /server/main.js у меня есть:

Meteor.publish("Categories", function () {
    return Categories.find({}, {sort: {order: 1}});
});
Meteor.publish("Venues", function () {
    return Venues.find();
});
Meteor.publish("VenuesForUser", function () {
    return VenuesAndUsers.find();
});

В /lib/router.js у меня есть:

Router.configure({
    // Other stuff

    waitOn: function() {
        return [
            Meteor.subscribe('Categories'),
            Meteor.subscribe('Venues'),
            Meteor.subscribe('VenuesForUser'),
        ];
    }
});

В /client/templates/list.html у меня есть:

{{#each xzz}}
    {{name}} - {{id}}<br />
{{/each}}

{{#each venues}}
    {{venueId}} - {{userId}}<br />
{{/each}}

В /client/templates/list.js у меня есть:

venues: function() {
    return VenuesForUser.find();
},
xzz: function() {
    return Venues.find();
}

Мой вывод:

Venue 1 - Venue 1 id
Venue 2 - Venue 2 id
...

И в консоли javascript я получаю:

Exception in template helper: .venues@http://localhost:3000/app/client/templates/list.js?2a82ae373ca11b4e9e171649f881c6ab1f8ed69b:11:7
bindDataContext/<@http://localhost:3000/packages/blaze.js?695c7798b7f4eebed3f8ce0cbb17c21748ff8ba8:2994:14
...

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

Но почему!?

Изменить: если я изменю все экземпляры «VenuesForUser» на «VenuesAndUsers», подписка будет работать. Но как это понять? Могу ли я давать имена только тем подпискам, которые соответствуют коллекциям?


person MastaBaba    schedule 16.10.2015    source источник


Ответы (2)


Публикации публикуют документы для ваших коллекций. Публикацию можно назвать random, но если она возвращает курсор из коллекции с именем NotRandom, то это коллекция, в которой они публикуются на клиенте.

У вас есть публикация с именем VenuesForUser, которая возвращает курсор из коллекции VenuesAndUsers. На стороне клиента VenuesAndUsers — это коллекция, содержащая данные, опубликованные с сервера. Таким образом, вы можете сделать только VenuesAndUsers.find(), так как нет коллекции с именем VenuesForUser. Имя публикации ни на что не влияет — это просто имя. Он не создает для вас новую коллекцию.

Надеюсь, я ясно дал понять.

person Oskar    schedule 16.10.2015
comment
Вы хотите сказать, что каким бы ни было имя моей публикации (и, следовательно, подписки), коллекция, которую необходимо запросить (на клиенте), остается коллекцией, на которой была основана подписка? - person MastaBaba; 16.10.2015
comment
@MastaBaba Да. Имя публикации имеет значение только на начальном этапе подписки. При первой подписке клиент сообщает серверу Hey! I would like to subscribe to "VenuesForUser". Как только это будет сделано, сообщение, отправленное из публикации VenuesForUser, будет Documents A and B were added to the collection "VenuesAndUsers". Клиент получает сообщение и добавляет документы A и B в коллекцию VenuesAndUsers. - person Oskar; 16.10.2015
comment
@MastaBaba Кроме того, мне очень нравится эта статья о DDP. Если вы еще не читали, то рекомендую. - person Oskar; 16.10.2015

Это должен быть не Метеор, а Монго, типа:

Platypi = new Mongo.Collection('platypi');

нет:

Platypi = new Meteor.Collection('platypi');
person B. Clay Shannon    schedule 17.10.2015
comment
Хм. Последнее, безусловно, работает для меня, хотя. - person MastaBaba; 17.10.2015
comment
Интересный; первый работает для меня, и я видел, как это задокументировано, поэтому я немного удивлен, что оба работают. - person B. Clay Shannon; 17.10.2015
comment
@B.ClayShannon Meteor.Collection раньше использовался для определения коллекций. Это изменение было изменено на Mongo.Collection, но изменение было обратным- совместим. Так что да, Mongo.Collection — это то, что вам следует использовать, но Meteor.Collection по-прежнему работает (но может перестать работать в какой-то момент в будущем!) - person Oskar; 17.10.2015