2016-03-29 31 views
2

以下代碼是收集有關費用和已完成任務到帳單數據庫的信息的事件。每次我運行這個過程時,我都會在帳單數據庫中收到2個條目。第一個條目總是空的,第二個條目是我想要的條目。流星在mongo數據庫中獲得雙重插入

'click .ConfirmCloseCase': function (event) { 
    var caseID = Session.get('CurrentClosingCaseID'); 
    var TasksToChange = Tasks.find({caseID:caseID,done:true,billed:false}); 
    var ExpensesToChange = Expenses.find({caseID:caseID,billed:false}); 
    // Create new Entry into bills Database 
    Bills.insert({"expensestotal":0,"taskstotaltime":0}, function(error, result) { 

    // Set all Tasks to billed 
    TasksToChange.forEach(function(task){ 
     Tasks.update(task._id, {$set: {"billed": true} }) 
     Meteor.call('BillsUpsert', result, {$push: {"tasks": task._id}}); 
     Meteor.call('BillsUpsert', result, {$inc: {"taskstotaltime": task.hours}}); 
    }) 

    // Set all Expenses to billed 
    ExpensesToChange.forEach(function(expense){ 
     Expenses.update(expense._id, {$set: {"billed": true} }) 
     Meteor.call('BillsUpsert', result, {$push: {"expenses": expense._id}}); 
     Meteor.call('BillsUpsert', result, {$inc: {"expensestotal": expense.amount}}); 
    }) 

    Router.go('/Bills'); 
    }) 
}, 

流星調用就像這樣:

Meteor.methods({ 
    BillsUpsert: function(id, doc){ 
    Bills.update(id, doc); 
    } 
}); 

我想這是我得到2項到數據庫是因爲代碼是異步運行。這是一個正確的假設嗎?...作爲一個後續有「簡單」的修復? :)

回答

1

我不認爲異步調用是你的問題的根本原因,但你可以顯著簡化所有的插入和更新移動到服務器驗證碼:

'click .ConfirmCloseCase': function (event) { 
    Meteor.call('closeCase',Session.get('CurrentClosingCaseID'),function(err,result){ 
    if (err){ 
     // handle error 
    } else { 
     Router.go('/Bills'); 
    } 
    }); 
} 

方法:

Meteor.methods({ 
    closeCase: function(caseId){ 
    // you need to implement security checks on caseId here! 

    // Synchronously create new document in Bills collection 
    var billId = Bills.insert({ expensestotal: 0, taskstotaltime:0 }); 

    // Set all Tasks to billed 
    var TasksToChange = Tasks.find({ caseID: caseID, done: true, billed: false }); 
    TasksToChange.forEach(function(task){ 
     Tasks.update(task._id, {$set: { billed: true} }); 
     Bills.update(billId,{ $push: { tasks: task._id }, $inc: { taskstotaltime: task.hours }}); 
    )}; 

    // Set all Expenses to billed 
    var ExpensesToChange = Expenses.find({ caseID: caseID, billed: false}); 
    ExpensesToChange.forEach(function(expense){ 
     Expenses.update(expense._id, {$set: { billed: true} }); 
     Bills.update(billId,{ $push: { expenses: expense._id }, $inc: { expensestotal: expense.amount }}); 
    )}; 
    } 
+0

謝謝你的努力@Michael Floyd。請看我的答案。因爲浪費你的時間,我真的很浪漫。我有我的插入和客戶端代碼更新,由於偉大的軟件包的集合:Collection2,simpleschema等。 – Gsuz

1

經過多次試驗和錯誤,我發現問題。我的數據庫中的雙重輸入與我發佈的代碼無關,是由於我的代碼中兩處不同地方的兩次調用函數的一個愚蠢錯誤。

對不起,浪費人們的時間在這篇文章。