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

使用Mongoose .find()多条件查询时遭遇CastError问题求助

问题:Mongoose搜索查询报错无法定位原因

尝试使用Mongoose的.find()方法构建搜索查询,期望接收查询参数后返回名称(name)或描述(description)包含该参数的条目,但持续报错却无法定位原因。

搜索函数代码

const searchQuery = async (q) => {
  try {
    const menuItems = await MenuItems.find({
      $or: [
        { name: { $regex: q, $options: "i" } },
        { description: { $regex: q, $options: "i" } }
      ]
    });

    return menuItems;
  } catch (error) {
    return error;
  }
};

参数传递逻辑代码

const searchQuery = async (req, res) => {
  try {
    const menu = await MenuItems.searchQuery(req.query.q);
    res.send(menu);
  } catch (error) {
    res.status(500).send(error);
  }
};

测试错误信息

通过Postman以GET请求调用路由/api/menu/search?q=pizza测试时,收到如下错误:

{
    "stringValue": "\"search\"",
    "valueType": "string",
    "kind": "ObjectId",
    "value": "search",
    "path": "_id",
    "reason": {},
    "name": "CastError",
    "message": "Cast to ObjectId failed for value \"search\" (type string) at path \"_id\" for model \"MenuItems\""
}
const menuItemsSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
    unique: true
  },
  price: {
    type: Number,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  imageUrl: {
    type: String
  },
  updatedAt: {
    type: Date,
    default: Date.now
  }
});
menuItemsSchema.set("toJSON", {
  virtuals: true
});
// menu model
const MenuItems = mongoose.model("MenuItems", menuItemsSchema);

问题分析与解决方案

核心问题1:路由匹配顺序错误

错误提示显示系统试图把search当作ObjectId去转换,说明你的路由配置中,动态参数路由(比如/api/menu/:id)的位置在搜索路由/api/menu/search之前。Express会按照路由定义的顺序匹配,当请求/api/menu/search时,会先匹配到/api/menu/:id,把search当成id参数传入,进而触发ObjectId转换错误。

解决方法:调整路由定义顺序,将/api/menu/search放在/api/menu/:id之前,确保Express优先匹配搜索路由。

核心问题2:模型方法调用错误

你定义的searchQuery是独立函数,并没有挂载到MenuItems模型上,所以await MenuItems.searchQuery(req.query.q)会抛出"searchQuery is not a function"的错误(当前被路由错误掩盖)。

解决方法:直接调用独立的searchQuery函数,同时建议重命名路由处理函数避免同名冲突:

// 确保独立的searchQuery函数已被正确导入
const handleSearchQuery = async (req, res) => {
  try {
    const menu = await searchQuery(req.query.q);
    res.send(menu);
  } catch (error) {
    res.status(500).send(error);
  }
};

内容的提问来源于stack exchange,提问作者reakurtis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:59:53