Mongoose的findById和find返回数据有差异吗?切换后无法访问属性怎么办
问题原因
Mongoose 中 find() 方法的返回值始终是文档数组,哪怕查询条件只匹配到1条数据,结果也会被包裹在数组中返回。而你之前使用的 findById() 方法返回的是单个文档对象,所以之前直接用 product.title 可以正常读取属性,现在拿到的是数组,直接访问 .title 自然是 undefined。
你贴出的返回数据其实是数组内的第一个文档元素,你可以自行验证:打印 product.length 会得到1,打印 Array.isArray(product) 会得到 true。
解决方法
有两种常用修复方案:
- 继续使用
find()方法:手动取数组的第一个元素即可,修改代码如下:
.then((product) => { // 先判断数组是否为空,避免报错 if (!product.length) { // 处理未找到产品的逻辑,比如返回404 return res.status(404).send('产品不存在') } const targetProduct = product[0] console.log("controller" + targetProduct.title) let brandId = targetProduct.brand[0].id // 后续逻辑保持不变,渲染页面时如果模板用的是product的属性,记得也对应修改,或者把targetProduct传给模板 })
- 更推荐的方案:改用
findOne()方法:findOne()和findById()行为一致,匹配到结果时直接返回单个文档对象,不需要额外处理数组,代码修改量最小:
// 只需要把Product.find改为Product.findOne即可 Product.findOne({slug: slug}) .populate("category") .populate("subCategory") .populate("brand") .populate({ path: 'rating', populate: { path: 'user', model: 'User' } }) .then((product) => { // 后续代码完全不需要改,和之前用findById的逻辑一致 console.log("controller" + product.title) // ... 剩下的逻辑保持不变 })
内容的提问来源于stack exchange,提问作者xetryDcoder
相关产品推荐
相关产品推荐

