Node.js中使用Promise从MongoDB获取订单数据失败求助
订单详情展示问题的解决方案
1. 数据库查询逻辑修正
你原本使用findOne()只会返回单个订单文档,而需求是获取用户所有订单,同时async函数本身就返回Promise,无需额外包装new Promise,修正后的代码如下:
getUserOrder: async (userId) => { // 用find查询用户所有订单,而非findOne let orders = await db.get().collection(collection.ORDER_COLLECTION) .find({ userId: objectId(userId) }) .toArray(); console.log(orders); return orders; }
错误根源:
findOne()返回单个对象,不是游标,因此没有toArray()方法,这是最初报错的原因;- 移除
toArray()后,orders变成单个订单对象,和模板中遍历orders.products的逻辑不匹配,导致页面无内容。
2. 模板渲染逻辑修正
你的HBS模板循环逻辑完全错误,且存在字段拼写问题,修正后的代码如下:
<tbody> {{#each orders}} <tr> <td scope="col">{{this.date}}</td> <td scope="col">{{this.deliveryDetails.address}}</td> <td scope="col">{{this.deliveryDetails.pincode}}</td> <td scope="col">{{this.deliveryDetails.phone}}</td> <td scope="col">{{this.totalAmound}}</td> <!-- 修正字段拼写:数据库中是totalAmound --> <td scope="col">{{this.paymentMethod}}</td> <td scope="col">{{this.status}}</td> <td scope="col"> <a href="/view-order-products/{{this._id}}" class="btn btn-info">View Details</a> </td> </tr> {{/each}} </tbody>
关键修正点:
- 用
{{#each orders}}遍历所有订单,而非orders.products; - 循环内部用
this指代当前订单对象,直接访问其属性; - 补充
<tr>标签,修复表格结构错误; - 统一字段拼写:数据库中是
totalAmound,模板中原来写成了totalAmount,需保持一致(建议后续将数据库字段改为totalAmount,符合常规拼写规范)。
3. 路由代码验证
路由部分无需大改,可添加日志确认数据是否正确获取:
router.get('/orders', verifyLogin, async (req, res) => { let orders = await userHelpers.getUserOrder(req.session.user._id); console.log("渲染的订单数据:", orders); // 日志排查数据是否正确 res.render('user/orders', { orders, user: req.session.user }); })
验证步骤:
- 启动服务后访问
/orders,查看控制台打印的orders是否为包含多个订单的数组; - 如果无数据,检查
userId是否正确传递,数据库中是否存在该用户的订单记录。
内容的提问来源于stack exchange,提问作者Sojo C Johny
相关产品推荐
相关产品推荐

