2016-03-29 9 views
2

次のコードは、経費および完了したタスクに関する情報を請求書データベースに収集するイベントです。このプロセスを実行するたびに、請求書データベースに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

多くの試行錯誤の末、問題が見つかりました。データベースへの二重項目は、私が投稿したコードとは関係がなく、私のコードの2つの異なる場所から関数を2回呼び出すことの愚かな間違いのためでした。

この投稿で時間を無駄にして申し訳ありません。