尝试将数据从集合填充到流星的aldeed:tabular模块时遇到问题。

我的代码如下所示,并且是common.js文件的项目根。
下面的所有代码都在一个文件中:
root / lib / hello.js

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

          database = new MongoInternals.RemoteCollectionDriver("mongodb://localhost:27017/mydb");
          idpool = new Mongo.Collection("idpool", {_driver:database});

        Meteor.publish('idpool', function(){
            return idpool.find();
        });

    });
}

if (Meteor.isClient) {

    Meteor.subscribe("idpool");
}


TabularTables = {};

Meteor.isClient && Template.registerHelper('TabularTables', TabularTables);

TabularTables.idpool = new Tabular.Table({
    name: "idpool",
    collection: idpool,
    columns: [
        {data: "_id", title: "id"}
    ]
});


表格代码必须是服务器和客户端可见的通用代码,但是当我运行上述代码时,未定义“ idpool”集合(超出范围)。

Reference Error: idpool is not defined


将数据库声明移到JS范围之外,然后我无法发布和订阅它。即:

database = new MongoInternals.RemoteCollectionDriver("mongodb://localhost:27017/adaptiveid");
idpool = new Mongo.Collection("idpool", {_driver:database});
//rest of the code.....


如果我尝试通过代码的常用表格部分第二次添加:

idpool = new Mongo.Collection("idpool");


我收到以下错误:


  错误:已经定义了一个名为“ / idpool / insert”的方法


我在这里做错了什么?如何声明数据库服务器端并将其公开给常见的表格代码。

最佳答案

您应该将代码放在/ lib文件夹中

  /lib
  if(Meteor.isServer){
       database = new        MongoInternals.RemoteCollectionDriver("mongodb://localhost:27017/adaptiveid");
      idpool = new       Mongo.Collection("idpool",   {_driver:database});
      //rest of the code.....
   }


为什么选择isServer和/ lib?好吧/ lib文件夹是一开始加载的第一个流星,但是该代码在客户端/服务器之间共享,这就是为什么要指定它仅在服务器中使用该代码的原因

注意Error: A method named'/idpool/insert' is already defined出现在这里,因为您两次声明了集合idpool。

idpool = new Mongo.Collection("idpool", {_driver:database})


您已经在其中声明了集合,为什么要声明两次?,只需删除第二个idpoll = new Mongo.Collection('idpool')

09-26 16:18