在我的Meteor应用程序中,我有一个Meteor方法,该方法将集合作为参数,并尝试在该集合上运行mongo insert
命令以创建新文档。代码使用setInterval
每10秒运行一次。
收集定义:
My_Collection_Name = new Meteor.Collection('my_collection_name');
<小时/> 服务器代码:
var collection = My_Collection_Name;
var data = [1,2,3,'a','b','c'];
Meteor.call('createDocument', collection, data);
<小时/> 方法:
Meteor.methods({
createDocument: function(collection, data) {
collection.insert({
data: data
});
}
});
<小时/> 但是,这会在控制台中返回以下错误:
I20141030-14:58:06.716(-4)? Exception in setInterval callback: TypeError: Object #<Object> has no method 'insert'
为什么这不起作用?是否可以将集合作为参数传递?提前谢谢!
答案 0 :(得分:3)
您会在客户端和服务器上拥有不同的集合(请在Understanding Meteor publish/subscribe阅读更多内容)。依赖~invate _collection
字段是有风险的。你真正想要的是确实将集合名称作为字符串传递给Meteor.call,确保服务器上的集合具有相同的变量名称,并在global
对象中按名称查找集合在服务器上:
// on the client:
MyCollection = new Mongo.Collection('record-set-name'); // set server-side by .publish()
Meteor.call('createDocument', 'MyCollection', data);
// on the server:
MyCollection = new Mongo.Collection('collection-name-in-mongo');
Meteor.methods({
createDocument: function(collectionName, data) {
global[collectionName].insert({
data: data
});
}
});
此模式由meteor-autocomplete用于pass collection names from the client to the server。
Understanding Meteor publish/subscribe解释了集合名称和集合变量名称在Mongo中的关系。
答案 1 :(得分:0)
在进一步检查集合对象后,我注意到它有一个_collection
对象,其中包含insert
,update
等函数。因此,将代码调整到下面可以解决在Meteor方法中针对集合参数运行Mongo命令的问题:
Meteor.methods({
createDocument: function(collection, data) {
collection._collection.insert({
data: data
});
}
});
答案 2 :(得分:-1)
我认为这里collection
变量作为集合名称,如果你有很少的集合名称,你可以像下面的服务器方法那样做
Meteor.methods({
createDocument: function(collection, data) {
if(collection == "firstcollection")
{
firstcollection.insert({
data: data
});
}
else if(collection == "secondcollection")
{
secondcollection.insert({
data: data
});
}
}
});