首页 > 解决方案 > 使用 Mongoose 查询时,如何保存查询并在渲染 EJS 页面时将其用作参数?

问题描述

我正在尝试构建一个管理仪表板和这个管理仪表板的一部分,我想展示猫鼬数据,例如用户和最近完成的辅导课程。在呈现页面时,我无法保存这些数据并将其分配给 EJS 参数。

// Admin Dashboard

  // Find students
  function getUsers() {
  User.find({tutor:false}, function(err, foundItems) {
    return foundItems
  })}
  // Find sessions
  function getSessions() {
  Session.find({}, function(err, foundItems) {
    return foundItems;
  })}

app.get('/admin', function(req, res){
    res.render("pages/admin", {
      users: getUsers(),
      sessions: getSessions()
    })
  });

标签: javascriptnode.jsfunctionmongooseejs

解决方案


第一个观察:

User.find()是一个异步函数,即程序的主要流程不会等待它执行,因此undefined会传递给JS对象。为避免这种情况,您必须返回一个承诺,或使用异步等待。这是一个例子:

async function getUsers() {
  const foundItems = await User.find({tutor:false})
  return foundItems;
}
  // Find sessions
  async function getSessions() {
  const foundItems = await Session.find({});
  return foundItems;
}

app.get('/admin', async function(req, res){
    res.render("pages/admin", {
      users: await getUsers(),
      sessions: await getSessions()
    })
  });

这更容易阅读。你可以让它更短:

async function getUsers() {
  return User.find({tutor:false});
}
  // Find sessions
  async function getSessions() {
  return Session.find({});
}

app.get('/admin', async function(req, res){
    res.render("pages/admin", {
      users: await getUsers(),
      sessions: await getSessions()
    })
  });

由于您直接返回foundItems(没有在任何地方使用它),您不需要等待它,您可以直接返回回调的承诺等待。


推荐阅读