CastError:将字符串“categories”转换为ObjectId失败问题求助
解决CastError: Cast to ObjectId failed for value "categories"问题
错误原因
你的后端路由中,/categories路由被定义在/:id(根据ID获取单个商品)路由之后。Express的路由匹配是按顺序进行的,当请求/api/products/categories时,它会被优先匹配到/:id路由,把字符串categories当成商品ID参数。Mongoose尝试将这个字符串转换为ObjectId类型,从而抛出转换错误。
解决方案
1. 调整路由顺序
将/categories路由移动到/:id路由之前,确保Express先匹配到分类路由:
// 正确的路由顺序 productRouter.get( '/categories', asyncHandler(async (req, res) => { console.log('get categories') const categories = await ProductModel.find().distinct('category') res.json(categories) }) ) // 单个商品路由放在分类路由之后 productRouter.get( '/:id', asyncHandler(async (req, res) => { // 你的单个商品查询逻辑 }) )
2. (可选)添加ID有效性验证
为/:id路由添加ObjectId格式验证,提前拦截无效ID请求,避免类似错误:
import mongoose from 'mongoose'; productRouter.get( '/:id', asyncHandler(async (req, res) => { // 检查ID是否为有效ObjectId if (!mongoose.Types.ObjectId.isValid(req.params.id)) { return res.status(400).json({ message: '无效的商品ID' }); } const product = await ProductModel.findById(req.params.id); if (product) { res.json(product); } else { res.status(404).json({ message: '商品不存在' }); } }) )
3. 验证前端请求类型
修正自定义Hook的返回类型定义,确保类型匹配:
export const useGetCategoriesQuery = () => useQuery({ queryKey: ['categories'], queryFn: async () => (await apiClient.get<string[]>('/api/products/categories')).data, })
调整后,前端请求/api/products/categories会正确匹配到分类路由,返回所有商品分类,导航栏就能正常展示分类列表了。
内容的提问来源于stack exchange,提问作者mariusep
相关产品推荐
相关产品推荐

