2016-03-29 26 views
2

Aşağıdaki kod, masraflar ve yapılan işler ile ilgili bilgileri bir fatura veritabanına toplayan bir etkinliktir. Bu süreci her çalıştırdığımda faturalar veritabanına 2 giriş alıyorum. İlk giriş her zaman boş ve ikincisi istediğim girişlere sahip.Meteor, mongo veritabanına çift ekleniyor

'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 çağrı böylece gibidir:

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

ben kod uyumsuz çalıştığı nedeni veritabanına 2 girdileri alıyorum bunu tahmin listem. Bu doğru bir varsayım mı? ... ve bir takip olarak "kolay" bir düzeltme var mı? :)

cevap

1

Ben asenkron çağrılar sorunun temel nedeni olduğunu sanmıyorum ama anlamlı sunucuya tüm ekler ve güncelleştirmeler taşıyarak bu kodu kolaylaştırabilirsiniz:

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

Yöntem:

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

Çalıştığınız için teşekkür ederiz @Michael Floyd. lütfen cevabımı gör. Zamanını boşa harcadığım için gerçekten ağlıyorum. Eklenen büyük paketler: Collection2, simpleschema vb. Birleşiminden dolayı müşteri kodumda eklerim ve güncellemelerim var. – Gsuz

1

Denemeden ve hatadan sonra sorunu buldum. Benim veritabanına çift giriş, benim gönderdiğim kod ile ilgili değildi ve benim kodda iki farklı yerden iki kez işlev çağırma parçası benim aptal bir hata nedeniyle oldu.

İnsanların bu yazı ile zaman harcadığı için üzgünüm.