【问题标题】:Why is my response empty from the second mongoose query? MERN-Stack为什么我的第二个 mongoose 查询的响应是空的? MERN堆栈
【发布时间】:2022-09-28 17:45:12
【问题描述】:

目标:根据给定的图书馆名称获取学生。学生模型具有在数据库中链接的库名称。

发生了什么: 1:检索链接到给定 ID 的名称(使用 useParams().id 获取库)。 2:根据找到的图书馆名称查找所有学生。

结果: 空回复。我觉得问题与library_name = library.name; 行有关。只是当第二个查询开始执行时该值尚未设置?因为当我在此行之后立即记录结果时,res.send(library_name); 名称显示正确。

app.get(\"/students/:id\", (req, res) => {
  const id = req.params.id;
  let library_name = \"\";
  LibraryModel.findById(id, (err, library) => {
    library_name = library.name;
  });
  
  StudentModel.find({library: library_name}, (err, students) => {
    if (err) {
      res.send(err);
    } else {
      res.send(students);
    }
  });
});

    标签: node.js mongoose


    【解决方案1】:

    你说的对。 library_name gehts 仅在您传递的回调函数中设置,这发生在调用 StudentModel.find(...) 之后。基本上,您当前正在并行执行这两个调用。 有三种方法可以解决此问题。

    将第二次调用移动到回调函数

    app.get("/students/:id", (req, res) => {
      const id = req.params.id;
      let library_name = "";
      LibraryModel.findById(id, (err, library) => {
        library_name = library.name;
        StudentModel.find({library: library_name}, (err, students) => {
          if (err) {
            res.send(err);
          } else {
            res.send(students);
          }
        });
      });
    });
    

    使用承诺为了避免所谓的“回调地狱”,您还可以使用承诺而不是回调函数并等待它们:

    app.get("/students/:id", async (req, res) => {
      const id = req.params.id;
      try {
        const library = await LibraryModel.findById(id);
        const students = await StudentModel.find({library: library.name});
        res.send(students);
      } catch (err) {
        res.send(err);
      }
    });
    

    使用单个聚合管道您还可以将这两个单独的数据库查询合并到一个聚合管道中。您需要先使用 $lookup,然后使用 $match 过滤特定条目。尽管如此,还有关于构建此查询所需的模式的附加信息。

    另一个提示我假设您正在尝试创建一个 RESTful API。您可能想要查看您的路径结构,因为 RESTful 方法会期望 ':id' 是学生的 ID,而不是图书馆的 ID。 看起来 GET '/libraries/:id/students' 在您的情况下更有意义。

    【讨论】:

    • 我以为我已经尝试过第一个选项,结果是一样的。但现在它起作用了!感谢您的帮助,我肯定会改变我的路径,这样它会更有意义。
    猜你喜欢
    • 2021-11-30
    • 1970-01-01
    • 2019-12-17
    • 2020-10-21
    • 2021-07-19
    • 2012-01-10
    • 2017-05-27
    • 1970-01-01
    • 2023-01-05
    相关资源
    最近更新 更多