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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 04:32:29