javascript - 如何创建 sequelize 事务以保存 deeplu 嵌套对象
问题描述
如果我有这样的对象要保存:
{
"objA": {
"attr1": 123,
"attr2": "dummy str",
},
"objB": [
{
"attr1": true,
"attr2": [ // this a list of objC's
{"attr1": 123, "attr2": false},
{"attr1": 456, "attr2": true},
]
},
{
"attr1": false,
"attr2": [ // this a list of objC's
{"attr1": 789, "attr2": true},
{"attr1": 101, "attr2": true},
]
},
]
}
关系如下:
- objA 有很多 objB
- objB 属于 objA
- objB 有很多 objC
- objC 属于 objB
Sequelize 文档在这一点上太浅了,它只展示了如何保存一个简单的对象。所以这就是我一直在尝试但没有成功:
const {objA, objB} = req.body;
return db.sequelize.transaction((t) => {
return objA.create(
{
attr1,
attr2,
index,
},
{ transaction: t }
).then((newObjA) => {
objB.forEach((obj) => {
return objB.create(
{ ...obj, objA_id: newObjA.id },
{ transaction: t }
).then((newObjB) => {
objB.attr2.forEach((obj) => {
return objC.create(
{ ...obj, objB_id: newObjB.id },
{ transaction: t }
).then((newObjC) => {
return newObjB.addObjC(newObjC, {
transaction: t,
}).then(() => {
return newObjA.addObjB(newObjB);
});
});
});
});
});
});
}).then(() => {
res.status(200).json({ MSG: "SAVE_SUCCESS" });
}).catch((err) => {
res.status(500).json({ MSG: "SAVE_ERROR" });
});
解决方案
您不应该将 forEach 与异步函数一起使用(forEach 用于同步迭代)。像这样使用for和await:
// assuming ObjA, ObjB, ObjC are registered sequelize models
return db.sequelize.transaction(async t => {
const newObjA = await ObjA.create(
{
attr1,
attr2,
index,
},
{ transaction: t })
for (const obj of objB) {
const newObjB = await ObjB.create(
{ ...obj, objA_id: newObjA.id },
{ transaction: t })
for (const attr of newObjB.attr2) {
const newObjC = await ObjC.create(
{ ...attr, objB_id: newObjB.id },
{ transaction: t })
await newObjB.addObjC(newObjC, {
transaction: t,
})
}
// you forgot to indicate transaction here in the original code
await newObjA.addObjB(newObjB, { transaction: t })
}
})
推荐阅读
- firebase - 来自控制台的 Firebase 云消息传递不起作用
- microsoft-graph-api - 如何清除邮件中的地址?
- python - 如何在不更新光标的情况下读取文件?
- .htaccess - 对子域使用 .htaccess 强制 SSL 和 WWW
- scala - 如何使用同一数据框的另一列过滤 Spark 中的列表(2.2 版)
- android - 动画后将视图重置为原始位置
- amazon-web-services - 使用自签名证书验证复制从属服务器上的主机身份
- json - Arduino 从软件串口接收数据
- jmeter - 如何让 jmeter 在很小的时间间隔内启动许多请求
- amazon-web-services - aws 策略资源中的名称前缀