【问题标题】:How to create nested requests with sequelize between two tables如何在两个表之间使用 sequelize 创建嵌套请求
【发布时间】:2019-10-06 01:07:32
【问题描述】:

我正在构建的 sequelize 后端中有两个表。第一个表是groups,第二个表是members。我想:

最后,我想提交一个包含用户 ID 的 api 请求。然后它将从members 表中获取所有记录,并为每条记录获取在members 表中作为外键引用的组。然后我想将组记录返回到前端。

有没有办法直接通过外键来获取外键记录还是需要两次请求?

这是我的代码:

路由器:

router.route('/user_groups/:userId')
    .get(memberController.getUserMember)

控制器:

    getUserMember: (req, res) => {
        let group_list = [];
        let user_id = req.params.userId
        Member.findAll({ where: { userId: user_id } })
            .then((response) => {
                for(let i = 0; i < response.length; i++){
                    Group.findByPk(response[i]['groupId'])
                        .then((group) => {
                            console.log(JSON.stringify(group))
                            group_list.push(group)
                        })
                        .catch((err) => {
                            console.log('Getting Group by Id error: ' + JSON.stringify(err))
                        })
                }
                console.log(group_list)
                res.status(200).send(data)
            })
            .catch((err) => {
                console.log('Getting member by Id error: ' + JSON.stringify(err))
            })
    },

第一个请求获取所有包含 userId 的成员记录 then 函数中的第二个请求将循环访问成员并获取 通过外键根据 Id 对每条记录进行分组 从组请求返回的每条记录都应该存储在一个数组中,然后数组将在最后返回......

对象未存储在数组中且未返回数组。不知道该怎么办。

模型成员:

const Member = database.define(
    "member",
    {
        id: {type: seq.INTEGER, primaryKey: true, autoIncrement: true},
        balance: {type: seq.FLOAT(9, 2), allowNull: true, defaultValues: '0.00', 
                validate: {isFloat: true}
        },
        open_tabs: {type: seq.INTEGER, allowNull: false, defaultValues: '0', 
                 validate: {isInt: true}
        },
        reference: {type: seq.STRING, allowNull: false, 
                 validate: {isAlphanumeric: true}
        },
        admin: {type: seq.BOOLEAN, allowNull: false, defaultValues: false, 
              validate: {isIn: [['true', 'false']]}
        },
        active: {type: seq.BOOLEAN, allowNull: false, defaultValues: false, 
              validate: {isIn: [['true', 'false']]}
        },
    },
    {
        createdAt:  seq.DATE,
        updatedAt:  seq.DATE,
    }
)


Member.belongsTo(Group)
Member.belongsTo(User)

模型组:

const Group = database.define(
    "group",
    {
        id: {type: seq.INTEGER, primaryKey: true, autoIncrement: true},
        name: {type: seq.STRING, allowNull: false, 
             validate: {}
        },
        description: {type: seq.TEXT, allowNull: true, 
                validate: {}
        },
//        icon: {type: seq.STRING, allowNull: false, 
//               validate: {}
//        },
        members: {type: seq.INTEGER, allowNull: false, 
                 validate: {isInt: true}
        },
        reference: {type: seq.STRING, allowNull: false, 
                 validate: {isAlphanumeric: true}
        },
        active: {type: seq.BOOLEAN, allowNull: false, defaultValues: false, 
              validate: {isIn: [['true', 'false']]}
        },
    },
    {
        createdAt:  seq.DATE,
        updatedAt:  seq.DATE,
    }
)


Group.belongsTo(User, {as: "Host"})

【问题讨论】:

    标签: javascript mysql sequelize.js


    【解决方案1】:

    基本问题是循环将在所有Group.findByPk()请求完成之前完成,一旦循环完成,数组就会被发送....但是数组仍然是空的!

    映射Group.findByPk() 承诺的数组,并在所有这些承诺都解决后使用Promise.all() 执行send()

    类似:

    getUserMember: (req, res) => {
    
            let user_id = req.params.userId
            Member.findAll({ where: { userId: user_id } })
                .then((response) => {
                     const groupPromises = response.map(member=>{
                          return Group.findByPk(member['groupId']).then(groups=>{
                             member.groups = groups;
                             return member;
                          }); 
                     });
                     return Promise.all(groupPromises).then(data=>res.status(200).send(data))
    
                })
                .catch((err) => {
                    console.log('Something went wrong in one of the steps ' + JSON.stringify(err))
                })
        },
    

    我假设您想要一个包含原始成员对象的数组,并将组分配给每个对象作为属性groups

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 2019-08-24
      相关资源
      最近更新 更多