我尝试将我的客户端订阅到我的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控制台中看到好友收藏,但我无法插入数据。我在客户端文件夹中的client.js中订阅,我的插入代码在客户端文件夹中的friend.js中也是如此。
答案 0 :(得分:3)
需要在两者客户端和服务器上定义集合。通常,这是通过将定义放在共享目录(如lib
:
<强> LIB /集合/用户friends.js 强>
userFriends = new Mongo.Collection('friends');
请注意,约定是使用集合名称的大写驼峰案例版本命名集合。所以称之为Friends
会更典型。
答案 1 :(得分:3)
您需要使用共享代码在两个环境中声明集合。
lib/user-friends.js
userFriends = new Mongo.Collection("friends");
client/user-friends.js
Meteor.subscribe("friends", function(){
console.log(userFriends.find().fetch());
});
在客户端中,请注意,集合订阅本质上是异步的(客户端上存在网络延迟,从服务器获取文档是固有的)。
这就是为什么如果您console.log
Meteor.subscribe
之后{@ 1}}收集内容,您将获得[]
,但如果您等到订阅准备就绪后使用回调,则文档将是显示正确。
答案 2 :(得分:1)
你有两个正确的答案,但他们确实为你提供了一些知识。以下是使用Meteor的文件结构(http://docs.meteor.com/#/full/structuringyourapp处提供)的内容。
在/ lib(共享)目录中
制作名为&#34; collections.js&#34;的文件并在其中创建您的收藏。
userFriends = new Mongo.Collection(&#34; friends&#34;);
我会改为执行userFriends = new Mongo.Collection(&#34; userfriends&#34;);这样您的收藏总是使用相同的单词,并根据您是否在客户端或服务器上工作而更改大小写。这非常有用。
在您的/客户端目录中
制作名为&#34; subscriptions.js&#34;的文件并在其中订阅您的收藏。
Meteor.subscribe(&#39;朋友&#39);
在您的/服务器目录中
制作名为&#34; publications.js&#34;的文件。并在其中发布您的收藏。
Meteor.publish(&#39;朋友&#39;,函数(){ return userFriends.find(); });
你不需要取物或任何东西。
基本上你的代码失败了,因为你在哪里试图容纳一切。我给你的是你工作的三个方面。客户端,共享,服务器。以这种方式设置你的应用程序,很容易立即弄清楚你在哪里工作。
希望有所帮助。