【发布时间】: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