MERN后端开发:MongoDB产品搜索功能报错排查求助
解决MongoDB产品搜索中的"Cannot read properties of undefined (reading 'keyword')"错误
问题场景
作为MERN栈新手,在实现MongoDB产品搜索功能时,使用Postman测试接口/api/v1/products?keyword=apple,出现错误:Cannot read properties of undefined (reading 'keyword')。相关代码如下:
apiFeaters.js 原代码
class APIFeatures { constructor(query, queryStr){ query = this.query; queryStr = this.queryStr; } search() { const keyword = this.queryStr.keyword ? { name: { $regex: this.queryStr.keyword, $options: 'i' } } : {} console.log(keyword); this.query = this.query.find({ ...keyword }); return this; } } module.exports = APIFeatures
productController.js 原代码
const APIFeatures = require('../utils/apiFeatures'); //Get all products => /api/v1/products?keyword=apple exports.getProducts = catchAsyncErrors (async (req, res, next) =>{ const apiFeatures = new APIFeatures(Product.find(), req.query) .search() const products = await apiFeatures.query; /* const products = await Product.find(); */ res.status(200).json({ success: true, count: products.length, products }) })
错误根源
APIFeatures类的构造函数赋值逻辑完全颠倒:
原代码把类的实例属性this.query赋值给参数query,把this.queryStr赋值给参数queryStr,导致类的实例属性this.queryStr始终为undefined,调用search()方法时访问this.queryStr.keyword自然触发错误。
修复步骤
1. 修正APIFeatures构造函数
将apiFeaters.js中的构造函数改为正确的赋值顺序:
class APIFeatures { constructor(query, queryStr){ // 把传入的参数赋值给类的实例属性 this.query = query; this.queryStr = queryStr; } search() { const keyword = this.queryStr.keyword ? { name: { $regex: this.queryStr.keyword, $options: 'i' } } : {} console.log(keyword); this.query = this.query.find({ ...keyword }); return this; } } module.exports = APIFeatures
2. 额外检查点
- 确认Postman请求URL正确携带
keyword参数,例如http://localhost:xxx/api/v1/products?keyword=apple - 验证
catchAsyncErrors函数正确处理异步错误,避免错误被吞 - 确保
Product模型已正确导入到productController.js中
测试验证
修改代码后重启后端服务,再次用Postman发送带keyword参数的请求,即可正常执行产品搜索逻辑,返回匹配的产品列表。
内容的提问来源于stack exchange,提问作者Asamad
相关产品推荐
相关产品推荐

