Sequelize Create Queries внутри цикла - PullRequest
0 голосов
/ 15 мая 2019

У меня проблемы с запросом к базе данных, циклический просмотр результата и повторение цикла еще 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;
}

Теперь все работает так!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...