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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 18:07:28