使用Mongoose查询MongoDB出现CastError的解决方案咨询
错误原因
Mongoose 调用findById方法时会先尝试将传入的id参数转换为MongoDB ObjectId类型,只要参数不符合ObjectId的24位十六进制格式规范,就会直接抛出Cast to ObjectId failed for value类型的CastError,不会进入返回null的查询逻辑,导致代码执行中断。
解决方案
可以通过提前校验id格式,或者捕获查询异常的方式实现需求,以下是两种可直接使用的实现方案:
方案1:提前校验id格式(性能优先)
先判断id是否符合ObjectId格式,仅合法时执行查询,否则直接返回undefined的user:
import mongoose from 'mongoose'; export async function getServerSideProps(context) { const session = await getSession(context); await dbConnect(); const id = context.params.id; let user = undefined; // 校验id格式合法性 if (mongoose.Types.ObjectId.isValid(id)) { user = await User.findById(id).lean(); if (user) user._id = user._id.toString(); } return { props: { user, session } }; }
方案2:异常捕获(兼容性优先)
用try-catch包裹查询逻辑,兼容所有可能的查询异常,出现错误时user保持undefined:
export async function getServerSideProps(context) { const session = await getSession(context); await dbConnect(); const id = context.params.id; let user = undefined; try { user = await User.findById(id).lean(); if (user) user._id = user._id.toString(); } catch (err) { // 捕获CastError等查询异常,不中断代码执行 } return { props: { user, session } }; }
- 若确认传入的id格式始终正确,优先选择方案1,执行效率更高
- 若需要兼容所有可能的查询异常场景,选择方案2容错性更强
内容的提问来源于stack exchange,提问作者Luke Grech
相关产品推荐
相关产品推荐

