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

电商网站API测试遇Postman错误:Cannot read properties of null (reading '_id')

电商网站API测试错误排查:Cannot read properties of null (reading '_id')

Postman测试电商网站API时触发错误:

{"error": "Cannot read properties of null (reading '_id')"}

以下是问题定位分析及具体修改建议:


核心错误原因

该错误是由于尝试读取null对象的_id属性导致,结合代码排查,存在两个关键问题:

  1. 认证中间件未等待异步查询结果,导致req.user为Promise而非实际用户文档
  2. 订单控制器中错误地对非Promise对象使用await,导致用户对象被转为null

具体修改方案

1. 修复Authenticate.js的异步调用问题

原代码中userService.findUserById(userId)是异步函数,但未使用await,导致user是Promise对象而非用户数据,后续操作user._id必然出错。同时需将next()移至try块内,避免错误场景下重复响应:

const jwtProvider = require("../config/jwtProvider.js");
const userService = require("../services/user.services.js");

const authenticate = async (req, res, next) => {
  try {
    const token = req.headers.authorization?.split(" ")[1];
    if (!token) {
      return res.status(401).send({ error: "Invalid token" });
    }

    const userId = jwtProvider.getUserIdFromToken(token);
    // 新增await等待异步查询结果
    const user = await userService.findUserById(userId);

    if (!user) {
      return res.status(401).send({ error: "User not found" });
    }
    req.user = user;
    // 将next()移至try块内,错误时不再执行
    next();
  } catch (error) {
    return res.status(500).send({ error: error.message });
  }
};

module.exports = authenticate;

2. 修复orderController中不必要的await

req.user在认证中间件修复后已是Mongoose文档对象(非Promise),无需使用await,否则会将无效对象转为null:

createOrder函数

const createOrder = async (req, res) => {
  const user = req.user;
  try {
    let createdOrder = await orderService.createOrder(user, req.body);
    return res.status(201).send(createdOrder);
  } catch (error) {
    return res.status(500).send({ error: error.message });
  }
};

findOrderById函数

const findOrderById = async (req, res) => {
  const user = req.user;
  try {
    // 修正变量命名错误:createdOrder → foundOrder
    let foundOrder = await orderService.findOrderById(req.params.id);
    // 修正状态码:查询用200而非201
    return res.status(200).send(foundOrder);
  } catch (error) {
    return res.status(500).send({ error: error.message });
  }
};

orderHistory函数

const orderHistory = async (req, res) => {
  const user = req.user;
  try {
    // 修正变量命名错误:createdOrder → orderHistory
    let orderHistory = await orderService.usersOrderHistory(user._id);
    // 修正状态码:查询用200而非201
    return res.status(200).send(orderHistory);
  } catch (error) {
    return res.status(500).send({ error: error.message });
  }
};

3. 额外优化建议

  • orderservices.js关联字段修正:findOrderById中populate("shippingAddress")拼写错误,需改为populate("shipAddress")(与createOrder中的字段名一致),避免关联数据无法加载
  • 错误信息细化:将Authenticate.js中模糊的"Invalid"错误信息改为"Invalid token",便于调试

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 21:54:55