猫鼬:如何生成有效的mongoose.Types.ObjectId?

Nic*_*ick 4 mongoose mongodb node.js

我正在对一些依赖于Mongoose模型的代码进行单元测试。我想验证函数是否已传递有效的ObjectId作为参数。我读过可以使用以下方法创建新的ObjectId对象:

 var id = mongoose.Types.ObjectId();
Run Code Online (Sandbox Code Playgroud)

但是,以下内容将始终返回false:

var id = mongoose.Types.ObjectId();
mongoose.Types.ObjectId.isValid(id) //false
Run Code Online (Sandbox Code Playgroud)

为什么是这样?是因为我要创建一个没有密钥的新ObjectId实例吗?查看Mongoose源代码,我可以看到mongoose.Types.ObjectId.isValid实际上是在本地mongo模块中定义的。我将继续研究驱动程序,但是如果有人可以立即告诉我为什么发生上述行为,我将不胜感激,可以节省时间:p

谢谢!

Joh*_*yHK 5

isValid是本机驱动程序中BSON 类的文献记录很少的方法ObjectID

如果查看该方法的源代码,则会发现它希望传入一个字符串,因此需要将其调用为:

mongoose.Types.ObjectId.isValid(id.toString())
Run Code Online (Sandbox Code Playgroud)

但是,正如@HMR在注释中指出的那样,的实现isValid有一个奇怪的怪癖,认为任何 12个字符的字符串都有效。参见来源

因此,不幸的是,最好使用以下方法自己实施检查:

if (id.toString().match(/^[0-9a-fA-F]{24}$/)) {
  // It's a valid ObjectId
}
Run Code Online (Sandbox Code Playgroud)

  • 根据此处的代码:https://github.com/mongodb/js-bson/blob/master/lib/bson/objectid.js#L241任何长度为12个字符的字符串都是有效的ID。因此,使用此实用程序功能的用户应格外小心。已经提出了一个问题:https://github.com/mongodb/js-bson/issues (2认同)