无法使用多个使用 mongoose 的 find() 函数传入 res.render

Unable to use several find() functions using mongoose to pass in res.render

我在一个网站上工作,该网站在主页上的不同类别组中显示多部电​​影,因此我尝试使用多个查找函数 (mongoose) 并将它们传递到渲染中以在视图中一起显示它们。问题是如果我尝试将查找函数中的电影数组存储在变量或 res.locals 中,它只是保持“未定义”状态。我似乎无法弄清楚如何在一个 get 响应中传递其中的几个数组。我是 Node 的新手,非常感谢任何帮助!

app.get("/", (req, res) => {
  // array of top-selling movies
  Movie.find({
    group: "Top-Selling Movies"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      res.locals.topMovies = movies;
    }
  });
  // array of new movies
  Movie.find({
    group: "New rental movies"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      res.locals.newMovies = movies;
    }
  });
  // array of recommended movies
  Movie.find({
    group: "Recommended For You"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      res.locals.recMovies = movies;
    }
  });
  // array of action/thrilling movies
  Movie.find({
    group: "Thrilling movies"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      res.locals.actionMovies = movies;
    }
  });
  res.render("categories");
});

我什至尝试过:

app.get("/", (req, res) => {
  var topMovies;
  var newMovies;
  var recMovies;
  var actionMovies;
  // array of top-selling movies
  Movie.find({
    group: "Top-Selling Movies"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      topMovies = movies;
    }
  });
  // array of new movies
  Movie.find({
    group: "New rental movies"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      newMovies = movies;
    }
  });
  // array of recommended movies
  Movie.find({
    group: "Recommended For You"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      recMovies = movies;
    }
  });
  // array of action/thrilling movies
  Movie.find({
    group: "Thrilling movies"
  }, function(err, movies) {
    if (err) {
      console.log(err);
    } else {
      // In EJS, use found items array and tap into attributes to display in frontend
      actionMovies = movies;
    }
  });
  res.render("categories", {
    topMovies: topMovies,
    newMovies: newMovies,
    recMovies: recMovies,
    actionMovies: actionMovies
  });

你可以使用 async/await

app.get("/", async (req, res) => {
  const topMovies = await Movie.find({ group: "Top-Selling Movies" })
  const newMovies = await Movie.find({ group: "New rental movies" })
  const recMovies = await Movie.find({ group: "Recommended For You" })
  const actionMovies = await Movie.find({ group: "Thrilling movies" })


  return res.render("categories", {
    topMovies: topMovies,
    newMovies: newMovies,
    recMovies: recMovies,
    actionMovies: actionMovies
  });
});

或者为了更好看的代码

app.get("/", async (req, res) => {
  const [topMovies, newMovies, recMovies, actionMovies] = await Promise.all([
    Movie.find({ group: "Top-Selling Movies" }),
    Movie.find({ group: "New rental movies" }),
    Movie.find({ group: "Recommended For You" }),
    Movie.find({ group: "Thrilling movies" })
  ])


  return res.render("categories", {
    topMovies,
    newMovies,
    recMovies,
    actionMovies
  });
});

编辑:同样在您的示例中,您可以仅使用过滤方法来限制数据库查询

app.get("/", async (req, res) => {
  const movies = await Movie.find()

  const topMovies = movies.filter(movie => movie.group === 'Top-Selling Movies');
  const newMovies = movies.filter(movie => movie.group === 'New rental movies');
  const recMovies = movies.filter(movie => movie.group === 'Recommended For You');
  const actionMovies = movies.filter(movie => movie.group === 'Thrilling movies');

  return res.render("categories", {
    topMovies,
    newMovies,
    recMovies,
    actionMovies
  });
});