尝试将数据从集合填充到流星的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')