电商网站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属性导致,结合代码排查,存在两个关键问题:
- 认证中间件未等待异步查询结果,导致
req.user为Promise而非实际用户文档 - 订单控制器中错误地对非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
相关产品推荐
相关产品推荐

