【问题标题】:Meteor getting double insert on mongo databaseMeteor 在 mongo 数据库上获得双重插入
【发布时间】:2016-03-30 08:20:43
【问题描述】:

以下代码是将有关费用和已完成任务的信息收集到账单数据库中的事件。每次我运行这个过程时,我都会在账单数据库中获得 2 个条目。第一个条目总是空的,第二个有我想要的条目。

'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 个条目是因为代码是异步运行的。这是一个正确的假设吗?......作为后续行动,是否有一个“简单”的修复? :)

【问题讨论】:

    标签: javascript mongodb asynchronous meteor


    【解决方案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 }} );
        )};
      }
    

    【讨论】:

    • 感谢您的努力@Michael Floyd。请看我的回答。我真的很抱歉浪费你的时间。由于组合了一些很棒的包:Collection2、simpleschema 等,我在客户端代码中进行了插入和更新。
    【解决方案2】:

    经过反复试验,我发现了问题所在。我的数据库的双重输入与我发布的代码无关,并且是由于我从代码中的两个不同位置两次调用该函数的愚蠢错误造成的。

    很抱歉在这篇文章上浪费了人们的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      • 2014-08-02
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      相关资源
      最近更新 更多