2016-02-25 125 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