运行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存在大小写、空格等匹配差异
修复方案
- 添加空值校验:在操作
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('添加技能失败,请稍后重试'); }); });
排查数据匹配问题:
- 打印
req.body.teacher的值,确认前端传入的教师名称是否准确 - 直接在数据库中查询
teacherFName字段,验证是否存在与传入值匹配的文档
- 打印
规范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
相关产品推荐
相关产品推荐

