2016-02-25 128 views
2

我正在使用Meteor,它使用Mongodb作为其数据库。当用户填写表单时,我有代码将几个文档插入到集合中。当插入这些文档时,我想在服务器端目录中引发一些JavaScript代码,这些代码通过相关集合对刚刚插入文档的具有匹配字段的文档进行排序。如何使用Meteor服务器端事件触发事件

我的问题是,我不知道如何在新文档到达时触发服务器上的代码。在涉及插入的代码的末尾有一个Meteor.method,Meteor.call是否有意义,用Meteor.method调用预先形成我需要的排序代码?

编辑:

正如你所看到的,在下面的代码我不调用任何流星方法为无尚不存在。这个代码的绝大多数仅仅是在页面末尾的insert({}),所以我认为它可以安全地被忽略。我唯一的服务器端代码是声明possibleGames mongo集合。

我不确定你的意思是通过调用一个普通的JavaScript函数,我的问题是得到任何代码触发。

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

Template.meet_form.events({ 
"submit .meet_form": function(event, template){ 
event.preventDefault(); 

var user = Meteor.userId(); 
var where = event.target.where.value; 

var checkedGames = []; 
function gameCheck (game) { 
    if (game.checked === true){ 
    checkedGames.push(game.value); 
    }; 
}; 

var checkedDays = []; 
function dayCheck (day) { 
    if (day.checked === true){ 
    checkedDays.push(day.value); 
    }; 
}; 

console.log(event.target.where.value) 

gameCheck(event.target.dnd); 
gameCheck(event.target.savageWorlds); 
gameCheck(event.target.shadowRun); 
console.log(checkedGames); 

dayCheck(event.target.monday); 
dayCheck(event.target.tuesday); 
dayCheck(event.target.wednesday); 
dayCheck(event.target.thursday); 
dayCheck(event.target.friday); 
dayCheck(event.target.saturday); 
dayCheck(event.target.sunday); 
console.log(checkedDays); 

var whereWhat = []; 
for (i = 0; i < checkedGames.length; i++) { 
    var prepareWhereWhat = where.concat(checkedGames[i]); 
    whereWhat.push(prepareWhereWhat); 
}; 
console.log(whereWhat); 

var whereWhatWhen = []; 
for (a = 0; a < whereWhat.length; a++) { 
    var prepareWWW1 = whereWhat[a]; 
    for (b = 0; b < checkedDays.length; b++) { 
    var prepareWWW2 = prepareWWW1.concat(checkedDays[b]); 
    whereWhatWhen.push(prepareWWW2); 
    }; 
}; 
console.log(whereWhatWhen); 


for (i = 0; i < whereWhatWhen.length; i++) { 
    possibleGames.insert({ 
    game: whereWhatWhen[i], 
    user: user, 
    created_on: new Date().getTime() 
    }) 
} 

} 
}); 
+0

你想在服务器上执行什么样的代码? –

+0

来自客户端的'insert'会导致一个'Meteor.method'调用,而不是你触发的那个。为了安全起见,您应该在服务器上使用“允许/拒绝”规则,或者防止客户端通过插入/更新直接变更数据,并使用显式方法。确保您验证来自客户端的输入。您可以在服务器上的方法体中执行所需的查询,或者在集合发生变化时使用'collection-hooks'包或'event-emitter'来执行某些操作。 – MasterAM

+0

我还没完全迷惑它,但我认为一个collection.find(),使用刚刚作为选择器到达的文档条目,然后对collection.find()的结果进行一些操作。 我有一个有趣的感觉,答案是非常明显的,并且是所有流星代码的主要部分,每个人都假设我知道这个代码,并且在使用它时遇到了一些异常问题。我只是不知道代码。 –

回答

0

你不需要在服务器上做一个meteor.call,因为你已经在服务器上了。 只需调用一个普通的javascript函数即可。

如果你想从你的第一个Meteor.method调用的是另一个Meteor.method,那么重构该函数以提取出公共位。

如果这仍然令人困惑,一些代码也会有所帮助。

+0

我做了一个编辑,向您展示我的代码。 –

+0

我认为这部分的流星指南可能对你有帮助吗?你在做什么有乐观的更新,更新minimongo并让流星做到这一点在后台调用。我建议做一个流星。首先明确地调用以查看管道工程如何工作。 – Joe