Pug模板渲染MongoDB查询数据时出现Cannot read property 'people' of undefined错误求助
解决Pug模板遍历Mongoose查询结果时的
Cannot read property 'people' of undefined错误 我懂你现在的纠结:明明路由里用Trip.findById能拿到正确的行程数据,打印products.name和products.people都正常,但到Pug模板里用each遍历就报错说找不到people属性。其实问题出在数据类型不匹配上,咱们一步步捋清楚:
问题根源
Trip.findById(prodId)返回的是单个Mongoose文档对象,而不是数组。但你在Pug里用了each item in prods——这个语法是专门用来遍历数组的。当你把单个对象传给each时,它会把对象的每个属性(比如name、people、kids等)当成遍历的"item",这时候每个item其实是属性的值(比如字符串类型的人数),自然没有people这个属性,所以就抛出了Cannot read property 'people' of undefined的错误。
两种解决方案
你可以根据自己的需求选其中一种:
方案1:把单个对象包装成数组传给模板(适合需要保持each语法的场景)
修改你的路由代码,把查询到的单个行程对象放到数组里:
app.use('/update/:productId', (req,res,next)=>{ const prodId = req.params.productId; Trip.findById(prodId).then(product=>{ console.log(product.name); // 此处能输出正确值 console.log(product.people); // 此处能输出正确值 // 将单个对象包装为数组 res.render('update', {prods: [product]}); }); });
这样Pug里的each item in prods就能正确遍历数组,每个item就是完整的Trip对象,访问item.people就没问题了。
方案2:直接使用单个对象,去掉each遍历(更简洁的方案)
既然你本来就只查询单个行程,完全没必要用遍历语法,直接修改Pug代码:
h1 #{prods.people}
这样直接访问传入的单个对象的属性,代码更简洁,也不会有类型不匹配的问题。
验证小技巧
如果你不确定传入模板的数据类型,可以在路由里加一行打印:
console.log("传入模板的数据类型:", typeof product, "是否为数组:", Array.isArray(product));
你会看到输出是传入模板的数据类型: object 是否为数组: false,这就能确认问题确实出在单个对象和数组的差异上。
内容的提问来源于stack exchange,提问作者Mahad Ali
相关产品推荐
相关产品推荐

