mongodb Mongoose .find()有多个条件,使用JavaScript获得强制转换错误

fykwrbwg  于 2023-10-16  发布在  Go
关注(0)|答案(2)|浏览(103)

我试图用mongoose.find()来创建一个搜索查询,但是我总是得到一个错误,我不知道为什么。它接收一个查询参数并返回其名称或描述包含该参数的项。
下面是搜索函数的代码:

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);
  }
};

我正在测试/调用它的路由“/API/菜单/搜索?q=pizza”作为postman中的get请求,我一直得到这个错误:

{
    "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);
iaqfqrcu

iaqfqrcu1#

  • 由于评论解决了这个问题,我将其添加为答案。*

看起来路由器将路径/search解释为value,您可能有另一条类似/api/menu/:id的路由,其中路由器将/search作为:id的值。
您必须更改顺序,因为路由是按从上到下的顺序解析的。
/api/menu/:id之前添加/api/menu/search路由器。

2w3kk1z5

2w3kk1z52#

您遇到的错误是由于Mongoose试图将q参数转换为ObjectId,因为它被视为您试图通过其_id字段查找文档。要解决此问题,您应该确保q作为查询参数正确传递,并且searchQuery函数正确处理它。
下面是searchQuery函数的正确代码:

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;
  }
};

这里的问题似乎在于如何在路由处理程序中调用searchQuery函数。您应该将req.query.q参数传递给函数,而不是试图将其作为MenuItems模型的属性访问。下面是正确的路由处理程序:

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

确保您的路由也被正确定义:

app.get("/api/menu/search", searchMenu);

通过这些更改,您的路由处理程序将正确地调用带有q查询参数的searchQuery函数,并且错误应该得到解决。现在,您应该能够调用路由“/API/menu/search?q=pizza”,而不会遇到ObjectId转换错误。

相关问题