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
相关产品推荐
相关产品推荐

