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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:18:17