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

运行Node.js+Mongoose代码时出现TypeError: Cannot read property 'skills' of null

问题:为教师添加Skill时出现TypeError: Cannot read property 'skills' of null

我编写了如下Node.js+Mongoose代码,意图为指定教师添加Skill,在执行foundTeacher.skills.push(skill)语句时,出现错误TypeError: Cannot read property 'skills' of null,无法实现为教师添加skill的功能,不清楚错误原因。

const skillsSchema = {
    title: String,
    description: String,
};

const Skill = mongoose.model('Skill', skillsSchema);

const teacherSchema = {
    profession: String,
    teacherFName: String,
    bornDate: Number,
    priceperhour: Number,
    videolink: String,
    email: String,
    password: String,
    skills: [skillsSchema],
};

const Teacher = mongoose.model('Teacher', teacherSchema);

app.post('/taddcourse', function (req, res) {
    const title = req.body.courseTitle;
    const discription = req.body.courseBody;
    const teacherName = req.body.teacher;

    const skill = new Skill({
        title: title,
        description: discription,
    });

    Teacher.findOne({ teacherFName: teacherName })
        .then(function (foundTeacher) {
            foundTeacher.skills.push(skill);
            foundTeacher.save();
            res.render('teacherdash', {
                teachName: foundTeacher.teacherFName,
                courses: foundTeacher.skills,
            });
        })
        .catch(function (err) {
            console.log(err);
        });
});

原因分析与解决方案

错误原因

foundTeacher为null,说明通过Teacher.findOne({ teacherFName: teacherName })没有找到匹配的教师文档,可能的原因包括:

  • 请求传入的teacherName在数据库的Teacher集合中不存在
  • 数据库中教师的teacherFName字段值与传入的teacherName存在大小写、空格等匹配差异

修复方案

  1. 添加空值校验:在操作foundTeacher前先判断是否为null,避免触发报错,同时处理教师不存在的场景:
app.post('/taddcourse', function (req, res) {
    const title = req.body.courseTitle;
    const discription = req.body.courseBody;
    const teacherName = req.body.teacher;

    const skill = new Skill({
        title: title,
        description: discription,
    });

    Teacher.findOne({ teacherFName: teacherName })
        .then(function (foundTeacher) {
            if (!foundTeacher) {
                return res.send('未找到指定教师,请检查教师名称是否正确');
            }
            foundTeacher.skills.push(skill);
            return foundTeacher.save();
        })
        .then(function(savedTeacher) {
            res.render('teacherdash', {
                teachName: savedTeacher.teacherFName,
                courses: savedTeacher.skills,
            });
        })
        .catch(function (err) {
            console.log(err);
            res.status(500).send('添加技能失败,请稍后重试');
        });
});
  1. 排查数据匹配问题:

    • 打印req.body.teacher的值,确认前端传入的教师名称是否准确
    • 直接在数据库中查询teacherFName字段,验证是否存在与传入值匹配的文档
  2. 规范Schema定义:建议使用mongoose.Schema构造函数定义Schema,而非普通对象,这样能更好地利用Mongoose的内置特性:

const skillsSchema = new mongoose.Schema({
    title: String,
    description: String,
});

const teacherSchema = new mongoose.Schema({
    profession: String,
    teacherFName: String,
    bornDate: Number,
    priceperhour: Number,
    videolink: String,
    email: String,
    password: String,
    skills: [skillsSchema],
});

const Skill = mongoose.model('Skill', skillsSchema);
const Teacher = mongoose.model('Teacher', teacherSchema);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:02:11