gpt4 book ai didi

javascript - 如何创建一个 sequelize 事务来保存深度嵌套的对象

转载 作者:行者123 更新时间:2023-12-03 22:25:47 24 4
gpt4 key购买 nike

如果我有这样的对象要保存:

{
"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 hasMany objB
  • objB 属于 objA
  • objB hasMany 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 of 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 })
    }
    })

    关于javascript - 如何创建一个 sequelize 事务来保存深度嵌套的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61918101/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com