mongoose ObjectId验证异常返回true 该校验函数是否足够可靠?
关于mongoose.Types.ObjectId.isValid的可靠性问题
使用以下字符串执行mongoose.Types.ObjectId.isValid()校验时,会意外返回true:
- mohamma22144
- mohamma22145
结论:该函数不足以作为严格的ObjectId校验依据
mongoose.Types.ObjectId.isValid()的核心逻辑仅校验传入值是否格式上可被转换为ObjectId,而非校验其是否为MongoDB标准生成的、或真实存在的ObjectId。
满足以下任意一个条件的输入,该函数都会返回true:
- 长度为12字节的任意字符串
- 长度为24位的十六进制字符串
- 已经是ObjectId类型的实例
你测试所用的两个字符串恰好为12位长度,因此符合格式校验规则,返回true属于该函数的正常表现。
正确的校验方案
如果需要严格校验输入是否为MongoDB标准生成的24位十六进制格式ObjectId,需要搭配正则做双重校验:
const objectIdReg = /^[0-9a-fA-F]{24}$/ function isStdObjectId(id) { return objectIdReg.test(id) && mongoose.Types.ObjectId.isValid(id) }
如果需要校验该ID是否真实存在于业务库中,仅靠格式校验没有意义,必须访问数据库查询对应记录是否存在。
内容的提问来源于stack exchange,提问作者m.eslampnah
相关产品推荐
相关产品推荐

