添加分类时出现Cannot read property 'categories' of null错误如何排查
报错原因排查
核心问题定位
user 为 null 是因为查询用户时传入的userId为undefined,导致User.findById()没有匹配到对应用户,直接返回null。具体问题点如下:
- 前端提交的请求体仅包含分类的4个字段,完全没有传递
userId参数 - 后端路由中解码JWT拿到了用户身份信息,但没有把该信息传递给控制器,控制器只能拿到前端传的请求体,自然获取不到有效
userId User.findById(undefined)执行后没有匹配结果,返回null,后续读取user.categories自然触发类型错误
代码写法错误
- Promise 回调写法错误:控制器中
then((user, err) => {})是老式Node回调的写法,Promise的then仅接收1个成功回调参数,异常会直接进入catch块,第二个参数err永远为undefined,你写的if(err) return false逻辑永远不会生效 - 同样的错误也出现在
user.save()的then回调中
逻辑安全问题
用户身份本应从JWT Token中解析获取,不应该依赖前端传递userId:既会出现当前的参数缺失问题,也存在越权修改其他用户数据的安全风险
修复方案
- 后端路由把JWT解码得到的用户信息传递给控制器,不要依赖前端传参
router.post('/', auth.verify, (req, res) => { // 路由解码后拿到的用户信息,直接挂载到req上传递给控制器 req.user = auth.decode(req.headers.authorization) CategoryController.addCategory(req) .then(result => res.send(result)) })
- 修复控制器的Promise写法,从req中取用户ID,增加空值拦截
module.exports.addCategory = (req) => { // 从token解析出的用户ID查询,不再依赖前端传参 const { _id: userId } = req.user const categoryParams = req.body return User.findById(userId) .then(user => { // 增加空值判断,避免异常报错 if (!user) return false user.categories.push(categoryParams) return user.save() }) .then(() => true) .catch(err => { console.log(err) return false }) }
- 前端不需要额外传
userId,原有请求逻辑可保留,建议把接口路径调整为/api/categories匹配功能语义
内容的提问来源于stack exchange,提问作者FoxcyLoxcy
相关产品推荐
相关产品推荐

