【问题标题】:Meteor.JS: Subscribe no workingMeteor.JS:订阅无效
【发布时间】:2015-05-25 19:42:36
【问题描述】:

我正在尝试将我的客户端订阅到我的 userFriends 集合和 Chrome 的控制台显示:userFriends is not defined

这是我的代码:

服务器端...

userFriends = new Mongo.Collection("friends");
console.log(userFriends.find().fetch())
Meteor.publish("friends", function () {
    return userFriends.find();
});

注意:console.log 在终端显示一个空数组,这很好

客户端...

Meteor.subscribe("friends");
console.log(userFriends.find().fetch())

注意:这是 Chrome 控制台显示错误的地方

我做错了什么?

谢谢

更新 1:现在我可以在 Chrome 的控制台中看到 Friends 集合,但我无法插入数据。我在客户端文件夹中的 client.js 中有订阅,我的插入代码也在客户端文件夹中的friend.js 中。

【问题讨论】:

标签: meteor publish-subscribe


【解决方案1】:

需要在客户端和服务器上定义集合。通常这是通过将定义放在共享目录中来完成的,例如 lib:

lib/collections/user-friends.js

userFriends = new Mongo.Collection('friends');

请注意,惯例是使用集合名称的大写驼峰式版本来命名集合。所以称它为Friends 会更典型。

【讨论】:

  • 谢谢兄弟。节省了我很多时间。我在兜圈子。
【解决方案2】:

您需要使用共享代码在两个环境中声明该集合。

lib/user-friends.js

userFriends = new Mongo.Collection("friends");

client/user-friends.js

Meteor.subscribe("friends", function(){
  console.log(userFriends.find().fetch());
});

请注意,在客户端中,集合订阅本质上是异步的(客户端存在网络延迟,这是从服务器获取文档所固有的)。

这就是为什么如果您在Meteor.subscribeing 之后立即console.log 您的收藏内容,您将获得[],但如果您使用回调等到订阅准备就绪,文档将正确显示。

【讨论】:

    【解决方案3】:

    您有两个正确答案,但它们确实为您假设了一些知识。下面是使用 Meteor 文件结构的样子(可在 http://docs.meteor.com/#/full/structuringyourapp 获得)。

    在您的 /lib(共享)目录中

    制作一个名为“collections.js”的文件并在其中创建您的收藏。

    userFriends = new Mongo.Collection("friends");

    我会改为 userFriends = new Mongo.Collection("userfriends");这样您的收藏始终使用相同的单词,并且您可以根据您是在客户端还是服务器上工作来更改大小写。这很有帮助。

    在您的 /client 目录中

    创建一个名为“subscriptions.js”的文件并在其中订阅您的收藏。

    Meteor.subscribe('朋友');

    在您的 /server 目录中

    制作一个名为“publications.js”的文件并在其中发布您的收藏。

    Meteor.publish('朋友',function(){ 返回 userFriends.find(); });

    你不需要 fetch 或任何东西。

    基本上你的代码失败了,因为你试图把所有东西都放在哪里。我给你的是你工作地点的三点。客户端、共享、服务器。以这种方式设置您的应用程序,您将很容易立即知道您在哪里工作。

    希望对您有所帮助。

    【讨论】:

    • 您好,朋友,感谢您的帮助。现在我可以在 chrome 的控制台中访问朋友集合,但我无法在我的代码中执行插入,我仍然拒绝访问
    • 您是否删除了自动发布和不安全?尝试“流星添加不安全”和“流星添加自动发布”。但实际上,这似乎是第二个问题。也许会专门针对插入或更新流星集合发表新帖子。
    • @thatgibbyguy 嘿,你能帮我解决同样的问题吗?我的收藏在/lib 中声明为Educations = new Mongo.Collection("educations");,发布为Meteor.publish("educations", function() { return Educations.find(); });,订阅为Meteor.subscribe('educations')。它们以调试模式显示,但不以生产模式显示。我在浏览器控制台中得到空数组。知道为什么吗??
    • 在您的调试中,您可能正在使用不同的数据库。这就是我能猜到的全部,因为如果它是一个空数组,则没有错误,只是没有数据(通常)。
    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 2014-10-21
    • 1970-01-01
    • 2021-10-15
    相关资源
    最近更新 更多