Mongoose报错Cast to ObjectId失败,Student模型_id路径转换错误求排查
错误触发原因
- 首要原因:路由匹配顺序错误
你大概率在/student/projects路由的上方定义了包含动态参数的同类路由,例如router.get('/student/:id', [中间件], [处理函数])。Express会按照路由定义的先后顺序匹配请求,当你访问/student/projects时,会优先匹配到先定义的动态参数路由,把路径中的projects(错误信息中截断为proj)当做id参数传入Student查询逻辑,试图用字符串类型的值匹配Student模型默认是ObjectId类型的_id字段,直接触发类型转换报错。 - 次要原因:当前路由的异步语法错误
Mongoose的find()是异步方法,你没有加await就直接赋值给变量,导致传给模板的是Mongoose的Query对象而非实际查询结果,后续模板渲染也会出现异常。同时当前的try/catch无法捕获异步方法抛出的错误。
修复方案
- 调整路由定义顺序,将无动态参数的精确匹配路由
/student/projects放到所有/student/开头的带动态参数路由的前面,保证优先匹配精确路由。 - 修正路由的异步语法,修复后代码如下:
// 给回调函数添加async关键字 router.get('/student/projects', signin, async (req,res)=>{ try{ const id = req.user._id // 加await等待数据库查询返回结果 const Projects = await PersonalProject.find({hostId: id}); const user = req.user; res.render("student/myProjects", {Projects, user}); } catch(err){ console.log(err); res.status(500).json({error: '项目查询失败'}) } });
额外检查项
- 确认JWT签发时存入payload的
_id为字符串类型,和PersonalProject模型中hostId的String类型匹配,避免后续查询无结果 - 确认PersonalProject模型导入正确,你导出的模型名为
Project,导入时需使用const PersonalProject = mongoose.model('Project'),不要写错模型名称
内容的提问来源于stack exchange,提问作者Kakashi Hatake
相关产品推荐
相关产品推荐

