You need to enable JavaScript to run this app. 添加分类时出现Cannot read property 'categories' of null错误如何排查
优惠活动
大模型
产品
解决方案
定价
更多

添加分类时出现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:既会出现当前的参数缺失问题,也存在越权修改其他用户数据的安全风险

修复方案

  1. 后端路由把JWT解码得到的用户信息传递给控制器,不要依赖前端传参
router.post('/', auth.verify, (req, res) => {
    // 路由解码后拿到的用户信息,直接挂载到req上传递给控制器
    req.user = auth.decode(req.headers.authorization)
    CategoryController.addCategory(req)
    .then(result => res.send(result))
})
  1. 修复控制器的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
        })
}
  1. 前端不需要额外传userId,原有请求逻辑可保留,建议把接口路径调整为/api/categories匹配功能语义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.04 08:15:10