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

NodeJS+MongoDB:如何查询匹配登录用户的订单并在EJS展示

解决方案:筛选当前登录用户的订单并正确渲染

我来帮你梳理下问题,其实你已经离解决问题很近了,主要是两个关键点没处理好:查询条件缺失和EJS循环变量错误。下面是具体的修复步骤和优化方案:

1. 修复EJS中的循环变量错误

你自己也提到了,vieworders.ejs里循环用了不存在的hurleys变量,这是前端无法渲染订单的直接原因。把循环里的hurleys全部替换成myorders即可:

<h1> Display Orders Here </h1>
<% if(myorders.length>0) { %>
<table border="1">
  <tr>
    <th>Index</th>
    <th>Name</th>
    <th>Size</th>
  </tr>
  <!-- 把hurleys改成myorders,修复循环变量错误 -->
  <% for(var i=0; i<myorders.length;i++) { %>
  <tr>
    <td><%= i + 1 %></td> <!-- 可选:索引从1开始更符合用户习惯 -->
    <td><%= myorders[i].name %></td>
    <td><%= myorders[i].ordersize %></td>
  </tr>
  <% } %>
</table>
<% } else { %>
No Record Found
<% } %>

2. 修改路由查询逻辑,只获取当前用户的订单

原来的路由是查询所有订单,没有添加筛选条件,所以你看到控制台能打印所有数据,但前端(修复变量后)会显示所有用户的订单,而不是当前登录用户的。我们需要在find方法里添加匹配条件,用req.user.username去匹配订单的name字段:

app.get('/vieworders', require('connect-ensure-login').ensureLoggedIn(), function(req, res) {
  // 添加查询条件:只返回name与当前登录用户username匹配的订单
  Myapplication.find({ name: req.user.username }, function(err, myorders) {
    // 增加错误处理,方便调试和避免崩溃
    if (err) {
      console.error('查询订单失败:', err);
      return res.status(500).send('服务器查询出错,请稍后重试');
    }
    res.render('vieworders', { user: req.user, myorders: myorders});
    console.log('当前用户的订单列表:', myorders);
  });
});

关键注意事项

  • 确保req.user.username的值和订单集合中name字段的值完全匹配(大小写、空格都要一致),如果注册时用户的用户名存在大小写差异,可能需要统一处理(比如都转成小写存储和查询)。
  • 用find而不是findOne是因为一个用户可能有多个订单,findOne只会返回第一条匹配的记录,而find会返回所有匹配的订单数组,更符合你的需求。
  • 这种在后端查询时就筛选数据的方式比前端过滤更高效,也更安全,不会泄露其他用户的订单数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:29:06