Node.js Sequalize создание новых строк в цикле forEach - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь создать новые строки в базе данных, используя Sequalize ORM.Я получаю массив коллекций от req.query.collections.Для каждой из этих коллекций мне нужно создать новый userCollection.Если не было создано ни одного userCollection s, я хочу ответить внутренней ошибкой сервера (строка 41), в противном случае вернуть массив объектов с вновь созданным userCollections.

Проблема в том, что я продолжаю получать внутренний серверошибка при выполнении тестовых запросов от Почтальона.Когда я проверяю свою базу данных, я вижу, что эти userCollections были созданы, поэтому ошибки не было.

Я знаю, почему это происходит: потому что userCollection.build({ stuff }).save() возвращает обещание.Поэтому, когда я пытаюсь выполнить console.log userCollections из оператора .then(), я получаю массив с недавно созданными коллекциями, как и должен был.Но к тому времени сервер уже ответил внутренней ошибкой сервера.

Вот мой код функции:

exports.addCollections = async (req, res, next) => {
    const libraryId = req.params.libraryId;
    const collections = req.query.collections;

    if (!collections)
        next(Boom.forbidden());

    const userCollections = [];

    collections.forEach(async (collectionId, index) => {
        const collection = await Collection.findByPk(collectionId);

        if (!collection)
            return next(Boom.notFound());

        userCollection.build({
            user_id: req.user.id,
            library_id: libraryId,
            public_collection_id: collection.id,
            title: collection.title,
            description: collection.description
        })
            .save()
            .then(newUserCollection => {
                userCollections.push(newUserCollection.get({ plain: true }));

                // should be printed first, but comes second
                // prints out the array with newly created record
                console.log(userCollections);
            })
            .catch(error => {
                console.log(error);
            });
    });

    // should be printed second, but comes first
    // prints out empty array
    console.log(userCollections);

    if (userCollections.length === 0) {
        next(Boom.internal());
    }

    res.json(userCollections);
}
...