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