Код выполняется до того, как я получу ответ из базы данных - PullRequest
0 голосов
/ 20 мая 2019

Я новичок в Express и пишу код, чтобы получить список из моей базы данных.Я пытаюсь обновить количество предметов в моем списке.Теперь может быть несколько предметов, и количество для этих предметов должно быть соответствующим образом обновлено.Проблема, с которой я сталкиваюсь, заключается в том, что, когда я пытаюсь получить список и обновить элемент соответствующим образом, перед выполнением моего цикла for для обновления элемента он не обновляет количество элемента в базе данных и сохраняет заказ .,Что я делаю не так?

Я использовал асинхронные функции, обещания и флаги для обновления количества элементов в базе данных, но ничего не помогает.

Это мой код для получения иобновить количество товара

const Express = require("express");
const app = Express.Router();
const Menu = require("../../models/Menu");
const Order = require("../../models/order");
const User = require("../../models/user");
app.post(
  "/create",
  async function(req, res) {

    var myorder = {};
    var orderList = [];
    var ordDetail = [];
    var UpdateMenus = [];
    orderList = JSON.parse(JSON.stringify(req.body["OD"]));
    if(orderList.length>0){
    const user = await User.findOne({ _id: req.user.id })
      .then(user => {
        if (!user) {
          return res.status(400).json({ error: "User Not Found" });
        }
      })
      .then(() => {

        var order = Order({
          user: req.user.id
        });
        myorder = order;


        (async function loop() {
          for (i = 0; i < orderList.length; i++) {
            const ordt = new Object({
              menu: orderList[i]["menuId"],
              order: myorder.id,
              prize: orderList[i]["prize"],
              quantity: orderList[i]["quantity"]
            });

            await Menu.findOne({ _id: orderList[i]["menuId"] })
              .exec()
              .then(menu => {
                if (menu) {
                  if (menu.quantity >= ordt.quantity) {
                    menu.quantity = menu.quantity - ordt.quantity;
                    const editmenu = menu;
                    (async function updateTheMenu() {
                      await Menu.findOneAndUpdate(
                        { _id: menu.id },
                        { $set: editmenu },
                        {
                          new: true,
                          useFindAndModify: false
                        }
                      ).then(updateMenu => {
                        console.log(updateMenu);
                        ordDetail.push(ordt);
                      });
                    })();
                  } else {
                    return res.status(400).json({
                      error:
                        menu.MenuText +
                        "" +
                        ordt.quantity +
                        " Qunatity Is Not Available"
                    });
                  }
                }
              });        
          }
        })();        

      }).then(()=>{
   order
      .save()
      .then(order => {
        if (!order) {
          return res.json({ error: "Order is not saved" });
        }
        res.status(200).json(order);
      })
      .catch(error => {
        return res
          .status(400)
          .json({ error: "Fields are Not Correct" });
      });

      });


  }
}
);

1 Ответ

0 голосов
/ 20 мая 2019

В вашем коде есть несколько ошибок:

  • Если вы используете await, тогда вам не нужно использовать then. Вы можете просто присвоить переменной. Пример:

    const menu = await Menu.findOne({ _id: orderList[i]["menuId"] })

  • Вам не нужно переносить цикл и каждый ожидающий вызов в async функциях. Они уже в функции async.

Вы можете написать свой обработчик ответа следующим образом:

app.post('/create', async function(req, res) {
  var myorder = {};
  var orderList = [];
  var ordDetail = [];
  var UpdateMenus = [];
  orderList = JSON.parse(JSON.stringify(req.body['OD']));

  if (orderList.length > 0) {
    const user = await User.findOne({ _id: req.user.id });

    if (!user) {
      return res.status(400).json({ error: 'User Not Found' });
    }

    var order = Order({
      user: req.user.id
    });

    myorder = order;

    for (i = 0; i < orderList.length; i++) {
      const ordt = new Object({
        menu: orderList[i]['menuId'],
        order: myorder.id,
        prize: orderList[i]['prize'],
        quantity: orderList[i]['quantity']
      });

      const menu = await Menu.findOne({ _id: orderList[i]['menuId'] });

      if (menu) {
        if (menu.quantity >= ordt.quantity) {
          menu.quantity = menu.quantity - ordt.quantity;
          const editmenu = menu;

          const updateMenu = await Menu.findOneAndUpdate(
            { _id: menu.id },
            { $set: editmenu },
            {
              new: true,
              useFindAndModify: false
            }
          );
          console.log(updateMenu);
          ordDetail.push(ordt);
        } else {
         return res
            .status(400)
            .json({
              error:
                menu.MenuText +
                '' +
                ordt.quantity +
               ' Qunatity Is Not Available'
            });
        }
      }
    }

    try {
      const savedOrder = await order.save();

      if (!savedOrder) {
        return res.json({ error: 'Order is not saved' });
      }
      res.status(200).json(savedOrder);
    } catch (error) {
      return res.status(400).json({ error: 'Fields are Not Correct' });
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...