Chrome/Safari控制台为何将MongoDB ObjectId显示为数字1?
为什么Chrome/Safari控制台展开对象时MongoDB ObjectId显示为1?
这确实是个挺让人摸不着头脑的控制台小坑,我来帮你拆解背后的核心原因:
ObjectId并非纯字符串,是BSON包装对象
大多数MongoDB驱动(比如Mongoose)返回的_id不是原生JS字符串,而是一个BSON ObjectId实例。这个实例内部携带了BSON的类型标识——而ObjectId对应的BSON类型码恰好是1,同时它还实现了toString()方法,用来输出我们熟悉的十六进制字符串。控制台展开和直接打印的逻辑不一样
- 当你直接执行
console.log(obj.data._id)时,JS会自动调用该对象的toString()方法,所以输出的是正确的十六进制字符串。 - 但当你展开控制台里的对象视图时,Chrome和Safari的DevTools会尝试解析对象的BSON元信息。如果识别到这是BSON类型对象,它会优先显示BSON类型码(也就是
1),而不是调用toString()后的结果——这就是你看到(Number)1的原因。
- 当你直接执行
快速验证的小方法
你可以在控制台里试试这两个操作:- 执行
typeof obj.data._id,会返回object而非string,证明它不是纯字符串; - 查看
obj.data._id._bsontype(Mongoose实例的话),会看到ObjectId的标识,而类型码对应的就是1。
- 执行
如果想要在展开视图里直接看到正确的十六进制值,你可以手动把ObjectId转为字符串后再存入对象,比如执行:
obj.data._id = obj.data._id.toString();
这样控制台展开时就会显示正常的字符串内容了。
内容的提问来源于stack exchange,提问作者Lee Brindley
相关产品推荐
相关产品推荐

