Nodejs异步使用knex覆盖值

时间:2017-04-29 06:14:21

标签: node.js async.js knex.js

我正在尝试使用异步保存数据库中的多个记录,但我总是在一条记录中覆盖其他记录。

这是我的逻辑:

var deferred = q.defer();

var records = [{emp_id:1, got_bonus: true},{emp_id:2, got_bonus: false},{emp_id:3, got_bonus: true}];

async.each(records, function(record, next){
    saveRecord(record)
      .then(){
          next(null);
      });
}, function(){
    deferred.resolve();
});

function saveRecord(record){
   record['activity_type'] = 'bonus'; 
   db_module.save(record);
}

db_module.js
----------------
function saveRecord(record){
   var deferred = q.defer();

   checkDuplicate(record)
      .then(function(isDuplicate)){
          if(!isDuplicate){
              knex('employees').insert(record);

              deferred.resolve();
          }
      });
   }
}

function checkDuplicate(record){
   return knex('employees')
            .where({'emp_id': record['emp_id']})
            .then(function(rows){
                return rows && rows.length > 0;
            });
}

我的问题是即使使用异步,代码也不会等待第一个记录保存然后再保存。数据库表中上面代码的结果是:

emp_id      got_bonus
-------     ----------
3            true
3            false
3            true

预期输出为:

emp_id      got_bonus
-------     ----------
1            true
2            false
3            true

我尝试使用async.waterfall但收到了同样的错误。我不知道如何使用同步模块。

2 个答案:

答案 0 :(得分:0)

为什么不按one shot -i.e

保存您的数据
var records = [
    {emp_id:1, got_bonus: true},
    {emp_id:2, got_bonus: false},
    {emp_id:3, got_bonus: true}
];
var modifiedRecords = records.map((i) => {
    return Object.assign({}, i, {
       activity_type : 'bouns',
    })
});

knex('employees')
  .insert(modifiedRecords)
  .then(()=> {
       /// sent response
   })

答案 1 :(得分:0)

我通过将 async.each 更改为 async.eachSeries 来解决此问题:

async.eachSeries(records, function(record, next){
  saveRecord(record)
    .then(){
      next(null);
    });
}, function(){
   deferred.resolve();
});

eachSeries 每个相同,但一次只运行一次异步操作。