【发布时间】:2020-08-14 20:50:22
【问题描述】:
我正在尝试创建订单并将订单与产品和数量相关联:
const t = await sequelize.transaction();
try {
const local_orderInstance = await LocalOrder.create({
user: req.body.client,
timestamp: Date.now(),
}, {transaction: t})
for(let order_item of req.body.items) {
const order_itemInstance = await LocalOrderItem.create({
quantity: order_item.quantity,
ProductReference: order_item.reference,
LocalOrderId: local_orderInstance.id
}, {transaction: t})
await t.commit()
res.json({message: `successfully saved order`})
}
} catch(error) {
await t.rollback()
res.status(503).json(error)
}
正如您所看到的,它与 sequelize 文档中的示例非常相似,但是发生了一件奇怪的事情,即使数据库中的所有插入都没有错误(调用 t.commit()),显然它仍然进入捕获部分并尝试回滚。之后我收到错误“事务无法回滚,因为它已完成状态:提交” 为什么即使没有抛出异常,它也会尝试执行 catch 部分? 我也收到了这个“[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的承诺拒绝将使用非零退出代码终止 Node.js 进程。”它真的要我尝试回滚吗?好吧,我试过了,我收到“错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头” nodejs坏了吗?
【问题讨论】:
-
可能你在一次迭代中调用了提交,但在接下来的某个地方失败了
-
你应该在循环之后提交。或每次迭代创建新的事务对象。
-
哦,我没有意识到我在循环中犯了该死的
-
很好解决了,谢谢,我想我需要休息一下:D
-
很高兴它有帮助:)
标签: javascript node.js sequelize.js