Meteor:创建集合:引用在chrome控制台中调试时出错

时间:2015-01-25 15:10:09

标签: node.js meteor

我遵循Meteor的教程我尝试为客户端和服务器创建一个集合。这是我的代码:

var lists = new Meteor.Collection("Lists");

if (Meteor.isClient) {

}

if (Meteor.isServer) {
  Meteor.startup(function () {
    // code to run on server at startup
  });
}

正如我读过的教程,当在服务器上运行时,如果我打开chrome控制台并输入lists,我将收到Meteor.Collection。但是当我在我的机器上试过时,我收到了错误:

  

参考错误。列表未定义

我做错了吗?请告诉我。

谢谢:)

3 个答案:

答案 0 :(得分:2)

此外,您可以将所有收藏集放在/lib/collection.js路线中(以获得更好的做法)。

因此,我们确保流星首先加载集合,并且它们将在客户端/服务器上可用。

你应该删除自动发布/不安全包,以避免流星在加载时发送所有集合并控制谁可以插入/删除/更新集合。

meteor remove autopublish
meteor remove insecure.

所以一个简单的集合看起来就像这样。

    //lib/collection.js
    Example = new Mongo.Collection("Example") //we create collection global
    if(Meteor.isClient) {
     Meteor.subscribe('Example') //we subscribe both after meteor loads client and server folders
    }

现在/server/collections.js

Meteor.publish('Example', function(){
          return Example.find(); //here you can control whatever you want to send to the client, you can change the return to just return Example.find({}, {fields: {stuff: 1}});
        }); 

//这里我们控制集合的安全性。

 Example.allow({
      insert: function(userId, doc) { 
        if(Meteor.userId()){
         return true; //if the user is connected he can insert
     } else{
    return false// not connected no insert
   }
 },
    update: function(userId, doc, fields, modifier) { //other validation },
    remove: function(userId, doc) { //other validation },
});

只是试着在流星上解释一下这里的集合,希望它可以帮助你GL

答案 1 :(得分:1)

我认为你关闭了autopulish / autosubscribe。尝试

if (Meteor.isClient) {
    Meteor.subscribe('lists');
}

if (Meteor.isServer){
    Meteor.publish('lists',function(){
        return Lists.find();
    });
}

对于您的命名,我还建议您改变您对收藏品进行大写的方式。相反,它将是

var Lists = new Meteor.Collection("lists");

最后,查看https://github.com/matteodem/meteor-boilerplate了解您的目录结构,这样您就不必再执行if meteor.is了。

修改

完整代码应如下所示:

var Lists = new Meteor.Collection("lists");

if (Meteor.isClient) {
    Meteor.subscribe('lists');
}

if (Meteor.isServer){
    Meteor.publish('lists',function(){
        return Lists.find();
    });
}

答案 2 :(得分:1)

作为构建过程的一部分,所有脚本源文件都是wrapped in a function closure。为了使您的集合在该文件之外可见(或者在您的情况下 - 附加到window对象),您需要将其声明为全局变量:

Lists = new Meteor.Collection('lists');

请注意缺少var。正如@thatgibbyguy指出的那样,接受的模式是大写集合变量和camelcase集合名称。