Express本地库项目Pug模板报错:Cannot read properties of null (reading 'name')
解决Express + Pug中
Cannot read properties of null (reading 'name')错误 问题核心
你的book_list.pug模板尝试读取book.author.name,但部分book对象的author字段为null,导致报错。即便使用了populate("author"),仍有几种常见原因会引发这个问题。
排查与解决步骤
1. 检查数据库中的Book数据
直接查看MongoDB的books集合,确认每个文档的author字段:
- 若
author字段本身是null:说明创建Book时未关联有效的Author,需补全数据或在创建Book时强制传入合法的Author ID。 - 若
author是ObjectId,但对应的authors集合中无该ID的文档:会导致populate后author为null,需删除无效Book数据或补全对应的Author文档。
2. 验证Book模型的关联定义
确保models/book.js中author字段的关联配置正确:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; const BookSchema = new Schema({ title: { type: String, required: true }, // 重点检查ref值和字段类型 author: { type: Schema.Types.ObjectId, ref: 'Author', required: true }, // 其他字段... }); module.exports = mongoose.model('Book', BookSchema);
注意:ref的值必须和Author模型的名称完全一致(比如Author模型定义为mongoose.model('Author', AuthorSchema),则ref必须是'Author',大小写敏感)。
3. 确认populate代码的正确性
检查controllers/bookController.js中的查询语句:
exports.book_list = async (req, res, next) => { try { // 确保populate的参数是模型中定义的关联字段名(这里是单数author) const allBooks = await Book.find({}).populate('author').exec(); res.render('book_list', { title: 'Book List', book_list: allBooks }); } catch (err) { return next(err); } };
避免把populate('author')误写成复数populate('authors')或出现拼写错误。
4. 模板中添加容错处理
为避免后续类似空值报错,在book_list.pug中添加判断逻辑:
h1= title ul each book in book_list li #{book.title} - #{book.author ? book.author.name : '未知作者'}
这样即便author为null,页面也能正常渲染,不会抛出错误。
内容的提问来源于stack exchange,提问作者Piotrek940
相关产品推荐
相关产品推荐

