我试图用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);
2条答案
按热度按时间iaqfqrcu1#
看起来路由器将路径
/search
解释为value
,您可能有另一条类似/api/menu/:id
的路由,其中路由器将/search
作为:id
的值。您必须更改顺序,因为路由是按从上到下的顺序解析的。
在
/api/menu/:id
之前添加/api/menu/search
路由器。2w3kk1z52#
您遇到的错误是由于Mongoose试图将
q
参数转换为ObjectId,因为它被视为您试图通过其_id
字段查找文档。要解决此问题,您应该确保q
作为查询参数正确传递,并且searchQuery
函数正确处理它。下面是
searchQuery
函数的正确代码:这里的问题似乎在于如何在路由处理程序中调用
searchQuery
函数。您应该将req.query.q
参数传递给函数,而不是试图将其作为MenuItems
模型的属性访问。下面是正确的路由处理程序:确保您的路由也被正确定义:
通过这些更改,您的路由处理程序将正确地调用带有
q
查询参数的searchQuery
函数,并且错误应该得到解决。现在,您应该能够调用路由“/API/menu/search?q=pizza”,而不会遇到ObjectId转换错误。