我正在测试一些依赖于Mongoose模型的代码。我想验证函数是否已传递有效的ObjectId作为参数。我已经读过可以使用以下命令创建新的ObjectId对象:
var id = mongoose.Types.ObjectId();
但是以下内容总是会返回false:
var id = mongoose.Types.ObjectId();
mongoose.Types.ObjectId.isValid(id) //false
这是为什么?是因为我正在创建一个没有密钥的新ObjectId实例吗?通过Mongoose源我可以看到mongoose.Types.ObjectId.isValid实际上是在本机mongo模块中定义的。我会继续深入研究司机,但如果有人能告诉我为什么上述行为正在发生,我会很感激节省时间:p
谢谢!
答案 0 :(得分:4)
isValid
是本机驱动程序中BSON ObjectID
类的poorly documented方法。
如果您查看该方法的the source,您会发现它希望传入字符串,因此您需要将其称为:
mongoose.Types.ObjectId.isValid(id.toString())
然而,正如@HMR在评论中指出的那样,isValid
的实现有一个奇怪的怪癖,即考虑任何 12个字符的字符串是有效的。请参阅source。
不幸的是,使用类似的方法自己实施检查可能更好:
if (id.toString().match(/^[0-9a-fA-F]{24}$/)) {
// It's a valid ObjectId
}