【问题标题】:returning null when using value out of block使用块外的值时返回 null
【发布时间】:2019-08-08 08:00:19
【问题描述】:

我正在尝试查询一个集合,从中获取 ID,然后我正在查询另一个集合并发送响应。没有问题。我的问题是我正在使用 foreach,所以我试图从块中取出值并发送响应。但它正在抛出null。我安慰了块内的值,它给出了响应,但我无法访问块外的值。

代码

getDetails = async (req, res) => {
    let data: any[] = [];
    await employee.find({
        _id: new mongoose.Types.ObjectId(req.body.id)
    }, (err, obj) => {
        if (err) {
            console.log("No Such Employee")
        } else {
            obj.forEach(element => {
                employer.find({
                    user: new mongoose.Types.ObjectId(element.user)
                }, (err, details) => {
                    if (err) {
                        console.log("No such  employer")
                    } else {
                        for (var i = 0; i < detail.length; i++) {
                            let p_info = {
                                "id": detail._id,
                                "fname": details[i].fname "lname": details[i].lname "phone": details[i].phone,
                                "email": details[i].email,
                            }
                            data.push(p_info); // I can get value here

                        }

                    }

                })

            });
            res.send(data); // Cannot get value here
        }

    });
}

【问题讨论】:

  • 多个对象怎么可能有相同的_id,_id应该是唯一的。
  • .forEach() 中的异步操作,您需要所有这些操作的结果,这根本行不通。您的 .forEach() 循环在循环内的任何异步操作完成之前完成执行。因此,当您尝试发送 data 时,它是空的。您最好的机会是对所有数据库操作使用 Promise 接口(没有简单的回调)。然后,使用普通的for 循环而不是.forEach(),您可以在异步操作(返回承诺)上使用await,以便能够收集您可以在for 循环之后发送的所有结果。

标签: javascript node.js typescript express


【解决方案1】:

仅当所有异步数据库调用完成后才返回响应。见下文:

getDetails = async(req, res) => {
  let data = [];
  let employees;
  try {
    employees = await employee.find({
      _id: new mongoose.Types.ObjectId(req.body.id)
    });
  } catch (err) {
    console.log("No Such Employee");
  }
  let emp_len = employees.length;
  employees.forEach((emp_obj, idx) => {
    let details = await employer.find({
      user: new mongoose.Types.ObjectId(emp_obj.user)
    });
    for (var i = 0; i < patient.length; i++) {
      let p_info = {
        "id": patient._id,
        "fname": details[i].fname,
        "lname": details[i].lname,
        "phone": details[i].phone,
        "email": details[i].email,
      }
      data.push(p_info); // I can get value here
    }
    if (emp_len == idx + 1) {
      res.send(data); // Cannot get value here
    }
  });
}

【讨论】:

  • 这确实不是正确的做事方式,因为.forEach() 不会等待await。使用常规的for 循环而不是.forEach()。此外,您在 employee.find() 上的错误处理毫无意义,因为您继续尝试处理 employees,即使出现错误。
  • 我仍然得到 null @vikash
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 2014-07-26
  • 1970-01-01
  • 2018-11-23
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多