У меня проблемы с запросом к базе данных, циклический просмотр результата и повторение цикла еще 2 раза после этого перед созданием новой строки в базе данных.
function create() {
League.findAll()
.then(leagues => {
return Promise.all(leagues).then(leagues => {
for (const league of leagues) {
Club.findAll({
where: {
leagueId: league.id
}
}).then(clubs => {
return Promise.all(clubs).then(clubs => {
for (const club of clubs) {
for (const awayClub of clubs) {
if (club !== awayClub) {
Game.create({
date: new Date(),
isLeagueGame: true,
isCupGame: false,
homeClub: club.id,
awayClub: awayClub.id
})
}
}
}
})
})
.catch(error => { return false; })
}
})
.then(() => {
return true;
})
}).catch(error => { return false; })
}
Я вызываю эту функцию так:
router.post('/create', async (req, res, next) => {
const success = await myClass.create();
if (success) {
return res.status(201).json({ message: "League Games created!" });
}
return res.status(500).json({ message: "An error occured!" });
});
Таким образом, success
всегда undefined
, когда я регистрирую его после оператора await
. Я действительно не знаю, где моя ошибка здесь, я также плохо знаком с Обещаниями и Sequelize. Вероятно, придется работать с транзакцией, а здесь ...
EDIT:
function create() {
League.findAll()
.then(leagues => {
return Promise.all(leagues.map(async (league) => {
let clubs = await Club.findAll({ where: { leagueId: league.id } });
return Promise.all(clubs.map((club) => {
return Promise.all(clubs.map((awayClub) => {
if (club !== awayClub) {
return Game.create({
date: new Date(),
isLeagueGame: true,
isCupGame: false,
homeClub: club.id,
awayClub: awayClub.id
})
}
}))
}))
}))
})
.then(result => {
console.log("All Games created!");
return true;
})
.catch(error => {
console.log(error)
return false;
});
}
Сглаживает функцию сейчас, но когда я ее вызываю, кажется, что она все еще возвращает что-то, прежде чем я действительно нажму последний then
блок. Кроме того, вызывается последний then
блок get, create
вызывается для каждой игры, которая должна быть создана, но, похоже, они не сериализуются в базу данных, которая, по крайней мере, работала раньше.
EDIT2:
async function create() {
const leagues = await League.findAll();
leagues.forEach(async (league) => {
const clubs = await Club.findAll({ where: { leagueId: league.id }});
clubs.forEach(async (club) => {
clubs.forEach(async (awayClub) => {
if (club !== awayClub) {
const result = await Game.create({
date: new Date(),
isLeagueGame: true,
isCupGame: false,
homeClub: club.id,
awayClub: awayClub.id
});
}
});
});
});
return true;
}
Теперь все работает так!