代码在我从数据库获得响应之前执行

时间:2019-05-20 06:29:43

标签: node.js mongodb express

我是Express的新手,正在编写代码以从数据库中获取列表。我正在尝试更新列表中项目的数量。现在可以有多个物料,并且这些物料的数量需要相应地更新。我面临的问题是,当我尝试获取列表并相应地更新商品时,在我的for循环执行更新商品之前,它不会更新商品在数据库中的数量并保存订单< / strong>。我在做什么错了?

我使用了异步函数,promise和标志来更新数据库中的项目数量,但是没有帮助。

这是我用于获取和更新商品数量的代码

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 :(得分:0)

您的代码几乎没有错误:

  • 如果使用等待,则无需使用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' });
    }
  }
});