使用Mongoose更新MongoDB文档时出现Cannot set property 'isPublished' of null报错
报错核心原因
Cannot set property 'isPublished' of null的触发逻辑非常直接:await Course.findById(id)查询没有匹配到任何文档,最终返回了null,后续代码直接对null对象赋值属性,自然会抛出类型错误。
逐点排查修正
- 第一步:先确认查询是否真的拿到了文档
现在你把id硬编码在函数调用里,先在查询后加一行空判断,避免直接操作空值:async function updateData(id) { try { const course = await Course.findById(id); // 先打印查询结果,确认返回值内容 console.log("查询结果:", course); // 空值兜底,避免对null做属性赋值 if (!course) { console.log("未查询到对应ID的文档,检查ID是否正确"); return; } course.isPublished = true; course.author = "another author"; const result = await course.save(); console.log("更新完成:", result); } catch (error) { console.log(error.message); } } - 排查ID不匹配的常见场景:
- 你写死的ID
5a68fdf95db93f6477053ddd是早年Mongoose教程配套的示例ID,你本地mongo-exercises库的courses集合中根本不存在这个文档 - 可以直接在Mongo Shell里对当前库执行
db.courses.find(),取出集合里真实存在的文档id,替换硬编码的参数后再测试
- 你写死的ID
- 修复代码里的原有笔误:
你当前代码里定义的保存结果变量是resulti,但打印时写的是console.log(result),哪怕查询顺利通过、文档存在,这里也会触发result is not defined的引用错误 - 通用优化方案:
- 所有单文档查询的逻辑,都要先对返回值做空判断,再执行后续的属性赋值、save操作,从根源上避免空指针类报错
如果不需要基于查询到的文档做二次逻辑判断,也可以直接走Mongoose的原子更新接口,减少一次数据库查询:
const updateResult = await Course.findByIdAndUpdate(id, { isPublished: true, author: "another author" }, { new: true }); // new: true 代表返回更新后的最新文档
内容的提问来源于stack exchange,提问作者Jacceb
相关产品推荐
相关产品推荐

