客户端和服务器之间共享集合的Meteor

4

我是一名刚开始学习Meteor的新手,正在学习所有东西是如何工作的,请耐心等待。

在一个文件中一切都正常运行,但是在安装iron:router以实现多页面应用程序后,我意识到最好有单独的客户端和服务器文件。不幸的是,现在我在服务器和客户端之间同步集合时遇到了麻烦。我已经阅读了很多教程,但没有任何作用。

在我的server.js文件中:

Streams = new Meteor.Collection("streams"); 
 if (Meteor.isServer) {
  Meteor.publish('streams', function () {
  return Streams.find();
 });
}

在我的client.js文件中:
if(Meteor.isClient) {
   Meteor.subscribe("streams");
   Template.body.helpers = function(){
     return Streams.find();
 }
}

调试后,客户端显示“Streams”未定义。发生了什么?如何连接集合?

3个回答

4
经典架构:

lib/streams.js

Streams = new Meteor.Collection("streams"); 

server/streams.js

Meteor.publish("streams", function () {
  return Streams.find();
});

client/streams.js

Meteor.subscribe("streams");

Template.body.helpers({
  streams: function(){
    return Streams.find();
  }
});

lib文件夹应该放在哪里? - Frankie
2
你应该查看文档以了解文件的加载和放置:http://docs.meteor.com/#/full/structuringyourapp - Tom Freudenberg
1
将其创建在 Meteor 应用程序的根目录下,lib 目录下的文件总是最先被加载。 - saimeunt
文档还指出,lib文件夹中的文件首先被加载,并且对客户端和服务器都可用。它还建议将与集合相关的代码放在那里。在Github上的Discover Meteor示例应用程序是查看具有源代码的良好结构化Meteor应用程序的好地方,在lib文件夹中,您将看到一个集合文件夹,其中包含集合声明和CRUD:https://github.com/DiscoverMeteor/Microscope/tree/master/lib - Ahmad Ragab
console.log(Streams.find().fetch()); 的结果是 [] 但是当我运行 meteor mongo 后检查集合时,它显示集合不为空... - Frankie
显示剩余3条评论

0
如果您使用默认的autopublish软件包,您只需要执行以下操作:

lib/streams.js

Streams = new Meteor.Collection("streams");

部分。

0

你需要在客户端上定义Streams

if(Meteor.isClient) {
   Streams = new Meteor.Collection("streams"); 
   Meteor.subscribe("streams");
   Template.body.helpers = function(){
     return Streams.find();
   }
}

我猜这样可以消除错误,但是 Streams.find() 部分没有返回任何内容,也不是一个空集合... - Frankie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接