【问题标题】:Sequelize Transaction inside forEach loop在 forEach 循环中 Sequelize Transaction
【发布时间】:2018-04-16 23:54:12
【问题描述】:

我正在尝试使用 Node 7.0+ 的 async/await 语法在 forEach 循环中使用事务

当我尝试在控制台中打印提交的事务响应时,我能够看到这些值,但那些相同的值并未提交到 DB。

下面是代码:

documentInfo.forEach(async (doc) => { // array of documentInfo
    var frontImgName = await module.exports.uploadImage(docFiles, doc.front, req, res )
    var backImgName = await module.exports.uploadImage(docFiles, doc.back, req, res )

    var checkKycDoc = await KYCDocument.findOne({
        where: {
            kyc_id: checkUserKyc.dataValues.kyc_id,
            user_id: checkUserKyc.dataValues.user_id
        }
    })

    if (checkKycDoc) { //update
        var updateDocument = await KYCDocument.update({
            document_name: doc.document_name,
            front_image: frontImgName,
            back_image: backImgName
        }, {
            where: {
                kyc_id: checkUserKyc.dataValues.kyc_id,
                user_id: checkUserKyc.dataValues.user_id
            },
        }, {transaction})

        log('updateDocument', updateDocument.dataValues)

    } else { // insert
        var newKycDocument = await new KYCDocument({
            kyc_id: checkUserKyc.dataValues.kyc_id,
            user_id: checkUserKyc.dataValues.user_id,
            document_name: doc.document_name,
            front_image: frontImgName,
            back_image: backImgName,
            status: true
        }, {transaction})

        log('newKycDocument', newKycDocument.dataValues)
    }
    if (rowCount === documentInfo.length) {
        await transaction.commit() // transaction is printed on this line
        log('KYC has been uploaded successfully')
        helpers.createResponse(res, constants.SUCCESS,
            messages.KYC_UPLOAD_SUCCESS,
            {'error': messages.KYC_UPLOAD_SUCCESS}
        )
    } else {
        rowCount++
    }

})

【问题讨论】:

  • 我认为事务实际上是在.forEach()“外部”开始的。老实说,“在”所有迭代完成后提交确实更有意义,而不是在每次迭代上都尝试提交(我知道这是一个if 条件,但这不是重点)。因此,至少从美学的角度来看,for of 循环在这里更有意义。此外,您可能应该坚持使用"managed" transactions 模型,除非您有充分的理由不这样做

标签: node.js postgresql sequelize.js


【解决方案1】:

问题出在create 方法中。

为了解决这个问题,我必须使用以下方法创建一个新行:

var newKycDocument = await KYCDocument.create({
    kyc_id: checkUserKyc.dataValues.kyc_id,
    user_id: checkUserKyc.dataValues.user_id,
    document_name: doc.document_name,
    front_image: frontImgName,
    back_image: backImgName
}, {transaction})

我错过了.create 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2015-07-04
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多