Sequelize事务始终返回null

时间:2019-05-07 09:09:43

标签: node.js sequelize.js

我正在编写用于创建审核协议的后端。用户应该能够为审核协议创建标准。为此,我有以下后端方法可确保仅完全创建协议或取消创建过程。可以设置几种形式/标准。但是,可能只需要一种形式。我会使用if语句进行确认。

创建工作按预期进行。但是REST API始终向客户端返回null。因此,我无法在前端进行有关创建过程结果的进一步处理。

技术:Node.js和Sequelize。前端采用角形/离子型。 MySQL中的数据库。

我尝试了一些事务传递和返回语句。我试图将其与类似的代码段进行比较,该代码段按预期工作。

exports.setAudit = (req, res, next) => {
  trueFalseCriteria = req.body.trueFalseForms;
  isShouldCriteria = req.body.isShouldForms;
  generalCriteria = req.body.generalForms;
  measurementCriteria = req.body.measurementForms;
  toolId = req.body.toolId;

  // Transaction is used to roll the whole transaction back if something wents wrong
  return sequelize
    .transaction(t => {
      return audit
        .create(
          {
            // Creating an audit referencing the tool
            toolId: toolId
          },
          { transaction: t }
        )
        .then(
          // Getting the id of the audit that we just created
          audit => {
            return audit.id;
          },
          { transaction: t }
        )
        .then(auditId => {
          // Check wether the kind of form is used or not. If so, sequelize tries to do a bulk insert into the databases.
          // Each bulk insert throws an error if it fails to cancel the whole transaction
          if (trueFalseCriteria) {
            console.log(1);
            trueFalseCriteria.forEach(dataEl => {
              dataEl.auditId = auditId;
            });
            trueFalseCriterion.bulkCreate(trueFalseCriteria).catch(err => {
              // Throw error to cancel transaction
              throw new Error(err);
            });
          }
          if (isShouldCriteria) {
            console.log(2);
            isShouldCriteria.forEach(dataEl => {
              dataEl.auditId = auditId;
            });
            isShouldCriterion.bulkCreate(isShouldCriteria).catch(err => {
              // Throw error to cancel transaction
              throw new Error(err);
            });
          }
          if (generalCriteria) {
            console.log(3);
            generalCriteria.forEach(dataEl => {
              dataEl.auditId = auditId;
            });
            generalCriterion.bulkCreate(generalCriteria).catch(err => {
              // Throw error to cancel transaction
              throw new Error(err);
            });
          }
          if (measurementCriteria) {
            console.log(4);
            measurementCriteria.forEach(dataEl => {
              dataEl.auditId = auditId;
            });
            measurementCriterion.bulkCreate(measurementCriteria).catch(err => {
              // Throw error to cancel transaction
              throw new Error(err);
            });
          }
        }, { transaction: t });
    })
    .then(data => {
      console.log(5);
      res.status(200).json(data);
    })
    .catch(err => {

      console.log(6);
      if (!err.statusCode) {
        err.statusCode = 500;
      }
      next(err);
    });
};

预期结果:成功时返回状态码为200的Http响应 实际结果:空

1 个答案:

答案 0 :(得分:0)

我认为您在最后一个return缺少.then()

.then(auditId => {
   // Check wether the kind of form is used or not. If so, sequelize tries to do a bulk insert into the databases.
   .....
   if (measurementCriteria) {
       ....
   }
// RETURN SOMETHING HERE 
}, { transaction: t });