Sequelize事务在循环期间停止执行

时间:2018-03-08 22:39:50

标签: javascript express sequelize.js

我正在尝试执行循环遍历多个项目并将它们插入数据库的事务。如果我在每个数组中只有1个项目,代码执行正常,它会插入部署,工作人员和设备。但是,如果我在设备或工作人员中有2个或更多项目,则应用程序只会冻结,没有错误或任何其他内容。

控制台输出如下所示:

Executing (e337b7de-e95f-4d18-a2e9-1216cb8b7d61): START TRANSACTION;
----------------------CREATE DEPLOYMENT---------------
Executing (e337b7de-e95f-4d18-a2e9-1216cb8b7d61): INSERT INTO `deployments` (`id
`,`dateDeployed`,`dateReturned`,`city`,`province`,`country`,`fireName`,`fireNumb
er`,`fireCenter`,`unitNumber`,`comments`,`finalSold`,`status`,`createdAt`,`updat
edAt`,`contractId`,`deploymentTypeId`,`productId`) VALUES (DEFAULT,'2018-03-01',
'Invalid date','1','BC','CAN','1','1','1','1','test','','active','2018-03-08 22:
36:44','2018-03-08 22:36:44','5','1','1');
----------------------CREATE EQUIPEMENT---------------
----------------------CREATE EQUIPEMENT---------------
Executing (default): INSERT INTO `deploymentEquipments` (`createdAt`,`updatedAt`
,`deploymentId`,`equipmentId`) VALUES ('2018-03-08 18:09:31','2018-03-08 22:36:4
4',17,1);
Executing (default): INSERT INTO `deploymentEquipments` (`createdAt`,`updatedAt`
,`deploymentId`,`equipmentId`) VALUES ('2018-03-08 18:09:39','2018-03-08 22:36:4
4',17,2);

我的代码是这样的:

app.post('/deployment', function(req,res,next){

  var deployment = req.body;
  var crew = req.body.deploymentCrew;
  var equipment = req.body.deploymentEquipment;
  var deploymentId = "";


    //insert new deployment - start transaction, add deployment, get ID, loop through crew, loop through equipment
    models.sequelize.transaction(t =>
    {
      var equipPromises = [];
      console.log('----------------------CREATE DEPLOYMENT---------------');
      return models.deployment.create(req.body, {transaction: t})
        .then(function(newDeployment) {
          deploymentId = newDeployment.dataValues.id;
          for (var i = 0; i < equipment.length; i++) {
            console.log('----------------------CREATE EQUIPEMENT---------------');
            var equip = equipment[i];
            equip.deploymentId = deploymentId;
            equip.equipmentId = equipment[i].id;
            var equipPromise = models.deploymentEquipment.create(equip, equipPromises.push(equipPromise));
          }
          return Promise.all(equipPromises);
        })
        .then(function() {
          console.log('----------------------CREATE STAFF---------------');
          var crewPromises = [];
          for (var i = 0; i < crew.length; i++) {
            var staff = crew[i];
            staff.deploymentId = deploymentId;
            staff.staffId = crew[i].staff.id;
            var crewPromise = models.deploymentCrew.create(staff, crewPromises.push(crewPromise));
          }
          return Promise.all(crewPromises);
        });


    }).then(result => {
      console.log('deployment added');
      res.send(result);
    }).catch(err => {
      console.log('deployment creation failed');
      res.status(401).send({'message':err, 'redirect': '/'});
    });

});

为什么会发生这种情况的任何想法或想法都会受到赞赏。

由于

1 个答案:

答案 0 :(得分:0)

实际上非常简单,我没有将事务添加到循环的create语句中。所以现在就像:

//this is the old statement
//var equipPromise = models.deploymentEquipment.create(equip, equipPromises.push(equipPromise));
//this is the new correct way to do it
            equipPromises.push(models.deploymentEquipment.create(equip, {transaction:t}));