You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中Mongoose用户集合全量展示问题解决

解决Handlebars视图中展示所有用户的问题

你当前的核心问题是路由没有从数据库获取全量用户数据传递给视图,再加上模板循环变量名不匹配,导致最终只显示了当前登录用户(ensureAuthenticated中间件会把当前用户挂载到req.user,Handlebars默认会把这个变量注入模板上下文)。下面是具体的修复步骤:

1. 修改路由:获取所有用户并传递给视图

你已经定义了User模型,直接用它来查询所有用户即可,替代原来直接渲染视图的逻辑:

router.get('/dashboard/users', ensureAuthenticated, async (req, res) => {
  try {
    // 查询所有用户,可选按学校名称排序让列表更规整
    const users = await User.find({}).sort({ schoolName: 1 });
    // 将用户数组以`users`为键名传递给视图
    res.render('dashboard/users/index.hbs', { 
      pageTitle: 'Users',
      users: users
    });
  } catch (err) {
    console.error('获取用户列表出错:', err);
    res.status(500).send('加载用户列表失败,请稍后重试');
  }
});

如果你不习惯async/await,也可以用回调写法:

router.get('/dashboard/users', ensureAuthenticated, (req, res) => {
  User.find({}, (err, users) => {
    if (err) {
      console.error('获取用户列表出错:', err);
      return res.status(500).send('加载用户列表失败,请稍后重试');
    }
    res.render('dashboard/users/index.hbs', { 
      pageTitle: 'Users',
      users: users
    });
  }).sort({ schoolName: 1 });
});

2. 修正Handlebars模板的循环变量

你模板里用的是{{#each user}},但我们传递给视图的是users数组,需要把循环变量名统一:

{{#each users}} 
  <tr> 
    <td><a href="/dashboard/users/{{_id}}">{{schoolName}}</a></td> 
    <td>{{city}}</td> 
    <td>{{email}}</td> 
    <td>{{schoolRepresentativeName}}</td> 
    <td>{{schoolRepresentativeTutorMentor}}</td> 
  </tr> 
{{/each}}

3. 移除模型中多余的直接数据库操作

你在模型代码末尾写了这段代码:

// get all users from collection
db.collection("users").find({}).toArray(function(err, result) {
 if (err) throw err;
 console.log(result);
 db.close();
});

这段代码会在模型加载时自动执行,而且会关闭数据库连接,导致后续所有数据库操作失败,必须删除这段代码。所有数据操作都应该通过你定义的User模型来完成,不要直接调用db.collection。

内容的提问来源于stack exchange,提问作者user8331511

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:17:02