Перебор массива и асинхронное обновление базы данных - PullRequest
0 голосов
/ 11 января 2020

Я использую Express узел, MongoDB. В этом приложении.

Идея: отправка запроса Post содержит массив объектов, => проверить, существовал ли ранее какой-либо объект, => добавить несуществующие элементы к массиву в документе за один раз.

проблема: каждый раз, когда я отправляю запрос на публикацию, добавляется только один элемент. Я должен повторить 3 раза, чтобы добавить массив из 3 элементов.

Решение попыталось: до того как я использовал promise.all () ничего не было добавлено. после того как я использовал обещание. добавляется только один элемент

код:

   .post(cors.corsWithOptions, authenticate.verifyUser, (req, res, next) => {
        let favstoAdd = req.body.favorites;
        let user = req.user;


        //check if the user have a favorites already and create favorites if it is not existed
        var p1 = Favorites.findOne({ user: user._id })
            .then((res_user) => {
                if (res_user !== null) {

                }
                else {
                    Favorites.create({ user: user._id, favorites: [] });

                }
            });

        //check if the dish Existed before in the favs and add them to the new filtered array 
        var altered_favstoAdd = [];


        var p2 = favstoAdd.map((fav) => {
            Favorites.findOne({ favorites: fav._id })
                .then((dish) => {
                    if (dish == null) {
                        altered_favstoAdd.push(fav);
                    }

                })
                .catch((err) => { next(err) });
        });

        var p3 = promise.all([p1, p2]).then(values => {
            //update favorite 
            for (let i = 0; i < altered_favstoAdd.length; i++) {
                let alt_fav = altered_favstoAdd[i];
                Favorites.update({ user: user._id }, { $push: { favorites: alt_fav } }, { new: true }, (err, resp) => {
                    if (err) { next(err); }
                })
            }




        });

        //respond with the favorite item
        promise.all([p3]).then(
            Favorites.findOne({ user: user._id })
                .then((favorite) => { res.json(favorite); })
                .catch((err) => { next(err) })
        )

    })

Я думаю, проблема в функции карты:


        var p2 = favstoAdd.map((fav) => {
            Favorites.findOne({ favorites: fav._id })
                .then((dish) => {
                    if (dish == null) {
                        altered_favstoAdd.push(fav);
                    }

                })
                .catch((err) => { next(err) });
        });

эта функция делает не перебирать весь массив, что-то мешает этому. любые идеи ??

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