Sequelize / Bluebird - запись содержимого массива в базу данных в правильном порядке - PullRequest
0 голосов
/ 02 марта 2020

Я использую Sequelize в качестве ORM и библиотеку обещаний Bluebird.

В приложении-рецепте, которое я создаю, я написал несколько асин * c функций, которые после написания нового рецепта были написаны. в базу данных, и при передаче массива ингредиентов со стороны клиента проверяет, существует ли каждый из них в базе данных. Затем он записывает каждый ингредиент в базу данных, если он еще не существует, и, наконец, записывает ссылку на идентификатор рецепта и каждый из его идентификаторов ингредиента в таблице соединений.

Все это работает без проблем, но я не могу понять, как заставить ингредиенты записывать в базу данных в том же порядке, в котором они записаны в исходном массиве? Я думаю, что это может быть связано с тем, как я использую async / await, или с тем, что я сопоставил каждый элемент массива ингредиентов?

Мой код здесь:

var ingredients = req.body.ingredients
            const recipe = await Recipe.create(req.body.information)
                .then(async function(createdRecipe) {
                        // Adding ingredients
                        ingredients.map(async function (ingredient) {
                            console.log(ingredient)
                            // Query the db to see if there are any matching ingredients already
                            Ingredient.count({
                                where: {
                                    title: ingredient
                                }
                            }).then(async function (count) {
                                console.log('here', ingredient)
                                // Does already exist
                                if (count > 0) {
                                    // Return this data into the function
                                    return Ingredient.findOne({
                                        where: {
                                            title: ingredient
                                        }
                                    })
                                } else {
                                    // Create the ingredient and return this
                                    return Ingredient.create({
                                        title: ingredient
                                    })
                                }
                            }).then(async function (createdIngredient) {
                                // Add this data into the RecipeIngredient table
                                return createdRecipe.addIngredient(createdIngredient)
                            }).then(function (added) {
                                // Once this is all done, return to home dashboard
                                res.send(recipe)
                            })
                        })
                    }
                )

В первом файле console.log ингредиенты печатаются в правильном порядке. К тому времени, когда мой код попадет во второй файл console.log, они будут в неправильном порядке.

Любая помощь будет принята с благодарностью - спасибо!

...