我在尝试将数据从集合填充到meteor的aldeed:tabular模块时遇到问题。
我的代码看起来像这样,并且是作为common.js文件的项目的根 以下所有代码都在一个文件中: 根/ 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'的方法
我在这里做错了什么?如何声明数据库服务器端并将其公开给公共表格代码。
答案 0 :(得分:1)
您应该将代码放在/ 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')
答案 1 :(得分:0)
我也陷入困境,文档只是简单地说“用通用代码定义你的表” - 这一切都非常正确,但同样重要的是服务器和客户端都必须能够访问你的集合。
所以我发现,在一个文件中定义我的所有集合,创建一个'lib / collections.js',对我来说效果很好,所以我知道它们是存在的,当我重构时,我没有忘记它们何时出现,所以我会有类似的东西:
export const idpoll = new Mongo.Collection('idpool');
export const otherCollection = new Mongo.Colletionc('myOtherCollectin');
然后在我的代码中的任何其他地方,如果我需要该集合,我只是导入它:
import { idpoll } from './lib/collections.js' //ie. path to collections.js
在我的项目中我有多个表,因此我决定创建一个lib / init-tables.js文件
export let TabularTables = {};
Meteor.isClient && Template.registerHelper('TabularTables',TabularTables);
然后对于每个表我都有一个lib / myNameTable.js文件以及初始设置。
import { TabularTables } from './init-tables.js'; // Import TabularTables helper
import { idpoll } from './collections.js';
TabularTables.Regs = new Tabular.Table({
name: 'IDPOL',
collection: idpol,
columns: [
{data: 'field', title: 'fieldtitle'},line'},
...
]
});
答案 2 :(得分:-1)
我确定它的标准做法是在lib文件夹中声明新的集合,以便在其余代码运行之前创建它们 将idpool行移动到lib并重试