【问题标题】:ExpressJS and Mongoose query scope problemExpressJS 和 Mongoose 查询范围问题
【发布时间】:2021-09-09 17:56:53
【问题描述】:

我正在尝试编写一段代码:

router.get("/", async (req, res) => {
  let listElevators = [];
  await Building.findById(req.body.id).then((building) => {
    building.Equipement.forEach(async (e) => {
      await Elevator.findById(e).then((rzlt) => {
        let bool = false;
        rzlt.Equipement_elevator.forEach((equip) => {
          if (equip.Year == req.body.year) {
            bool = true;
          }
        });
        if (bool) {
          listElevators.push(e);
        }
      });
    });
  });
  res.status(200).json(listElevators);
});

问题是“listElevators”在我返回时总是为空,但如果我在“if (bool)”之后立即进行控制台日志,则该变量不为空。

大家知道问题出在哪里吗?

谢谢

【问题讨论】:

  • 尝试 for 循环而不是 forEach 循环。
  • 您的代码不会在这一行等待异步执行:building.Equipement.forEach(async (e) => {

标签: node.js mongodb express mongoose


【解决方案1】:

不要使用let listElevators = [];,而是使用var listElevators = []

【讨论】:

    【解决方案2】:

    我会这样重写你的函数。

    注意事项

    • 我已经删除了所有的 .then,它们不再需要,因为你有 async/await

    • 我在第一个 forEach 之外添加了 await 以确保当循环内的所有内容都完成时调用 res.status()

    • 去掉if (bool),把逻辑直接移到第一个if

      router.get('/', async (req, res) => {
       let listElevators = [];
       try {
         const building = await Building.findById(req.body.id);
         await building.Equipement.forEach(async e => {
           const rzlt = await Elevator.findById(e);
      
           rzlt.Equipement_elevator.forEach(equip => {
           if (equip.Year == req.body.year) {
             listElevators.push(e);
           }
        });
      });
      
       res.status(200).json(listElevators);
       } catch (error) {
         console.log(error);
       }
      });
      

    【讨论】:

      【解决方案3】:

      不要使用asyncawait.then.catch,你的代码不干净

      使用for of 而不是第一个forEach

      router.get("/", async (req, res) => {
          try {
              let listElevators = [];
              let building = await Building.findById(req.body.id);
              for (let e of building){
                 let rzlt =  await Elevator.findById(e);
                 let bool = false;
                 rzlt.Equipement_elevator.forEach((equip) => {
                  if (equip.Year == req.body.year) {
                    bool = true;
                  }
                });
                if (bool) {
                  listElevators.push(e);
                }
              }
              res.status(200).json(listElevators);
          } catch (error) {
              console.log("Error: ", error);
          }
        });
      

      【讨论】:

        猜你喜欢
        • 2018-01-23
        • 1970-01-01
        • 2019-07-28
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 2012-04-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多