在 Meteor 中访问订阅的问题

Posted

技术标签:

【中文标题】在 Meteor 中访问订阅的问题【英文标题】:Issue with accessing subscriptions in Meteor 【发布时间】:2016-01-15 14:44:16 【问题描述】:

我正在尝试开发的 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”,则订阅有效。但这有什么意义呢?我只能为与集合匹配的订阅命名吗?

【问题讨论】:

【参考方案1】:

出版物将文档发布到您的收藏中。可以将发布命名为random,但如果它从名为NotRandom 的集合返回游标,那么这就是它们在客户端上发布到的集合。

您有一个名为VenuesForUser 的发布,它从集合VenuesAndUsers 返回一个游标。在客户端,VenuesAndUsers 是包含从服务器发布的数据的集合。所以你只能做VenuesAndUsers.find(),因为没有名为VenuesForUser的集合。出版物名称对其他任何内容都没有影响 - 它只是一个名称。它不会为您创建新集合。

我希望我说清楚了。

【讨论】:

您是说,无论我的出版物名称(以及订阅名称)如何,需要(在客户端)查询的集合仍然是订阅所基于的集合? @MastaBaba 是的。发布名称仅在初始订阅阶段有意义。当你第一次订阅时,客户端会告诉服务器Hey! I would like to subscribe to "VenuesForUser"。完成后,从“VenuesForUser”发布发送的消息是Documents A and B were added to the collection "VenuesAndUsers"。客户端收到消息并将文档A和B添加到集合VenuesAndUsers @MastaBaba 另外,我真的很喜欢this article on DDP。如果你还没有读过,我会推荐它。【参考方案2】:

必须是,不是Meteor,而是Mongo,比如:

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

不是:

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

【讨论】:

嗯。不过,后者肯定对我有用。 有趣;前者对我有用,这就是我看到它的记录方式,所以我有点惊讶两者都有效。 @B.ClayShannon Meteor.Collection 曾经是定义集合的方式。 It was changed to Mongo.Collection, but the change was backwards-compatible. 所以是的,Mongo.Collection 是您应该使用的,但 Meteor.Collection 仍然有效(但将来可能不会!)

以上是关于在 Meteor 中访问订阅的问题的主要内容,如果未能解决你的问题,请参考以下文章

Meteor 集合获取返回空数组但已订阅

在 Meteor 中,如何只查询给定订阅的记录?

UI helper 函数在 Meteor 中没有订阅数据

Angular2-meteor - 在订阅函数中使用排序的 find() 后未定义的变量

更改所有客户端的 Meteor 收藏订阅

如何检查用户是不是在 Meteor 中具有特定角色