2016-03-29 4 views
2

Der folgende Code ist ein Ereignis zum Sammeln von Informationen über Ausgaben und Aufgaben in einer Rechnungsdatenbank. Jedes Mal, wenn ich diesen Prozess durchführe, erhalte ich 2 Einträge in die Rechnungsdatenbank. Der erste Eintrag ist immer leer und der zweite hat die gewünschten Einträge.Meteor erhält doppelten Einsatz auf Mongo-Datenbank

'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'); 
    }) 
}, 

Der Meteor Anruf ist wie so:

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

denke, meine es, dass ich zwei Einträge in die Datenbank bekommen ist, weil der Code asynchron ausgeführt wird. Ist das eine korrekte Annahme? ... und als Nachfolge gibt es eine "einfache" Lösung? :)

Antwort

1

Ich glaube nicht, daß die asynchronen Aufrufe die Ursache des Problems sind, aber Sie können diesen Code wesentlich vereinfachen, indem Sie alle Ihre Einsätze und Aktualisierungen an den Server:

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

Methode:

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

danke für Ihre Bemühungen @ Michael Floyd. Bitte sehen Sie meine Antwort. Ich bin wirklich sry dafür, deine Zeit zu verschwenden. Ich habe meine Inserts und Updates in Client-Code aufgrund einer Kombination von aldeed großen Paketen: Collection2, simpleschema etc .. – Gsuz

1

Nach viel Versuch und Irrtum fand ich das Problem. Der doppelte Eintrag in meine Datenbank bezog sich nicht auf den Code, den ich gepostet hatte, und war auf einen dummen Fehler zurückzuführen, dass ich die Funktion zweimal von zwei verschiedenen Stellen in meinem Code aus aufgerufen habe.

Entschuldigung, dass wir mit diesem Beitrag Zeit verschwenden.

Verwandte Themen