Javascript 如何使用sequelize在两个表之间创建嵌套请求

Javascript 如何使用sequelize在两个表之间创建嵌套请求,javascript,mysql,sequelize.js,Javascript,Mysql,Sequelize.js,在我正在构建的sequelize后端中有两个表。第一个表是组,第二个表是成员。我想: 最后,我想提交一个包含用户Id的api请求。然后它将从members表中获取所有记录,并为每个记录获取在members表中作为外键引用的组。然后我想将组记录返回到前端 有没有办法通过外键直接获取外键记录,或者我需要提出两个请求 以下是我的代码: 路由器: router.route('/user_groups/:userId') .get(memberController.getUserMember)

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

最后,我想提交一个包含用户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))
            })
    },
模型组:

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"})

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

映射
组的数组。改为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))
            })
    },
我假设您想要一个包含原始成员对象的数组,并将组作为属性

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))
            })
    },