NodeJS 中 BSON 对象的 console.log
Posted
技术标签:
【中文标题】NodeJS 中 BSON 对象的 console.log【英文标题】:console.log of BSON objects in NodeJS 【发布时间】:2017-05-14 23:33:10 【问题描述】:我对 console.log 显示来自 NodeJS 的本机 MongoDB 驱动程序的 ObjectId() 对象的方式感到困惑。
我使用 console.log 从 MongoDB 打印 adslot
文档:
db.collection('adslots').findOne(_id: adslotId, (err, adslot)=>
console.log( adslot );
输出是
adslot:
_id: 57ef0b9b26d1d77b606bf271,
name: 'cspop',
width: 1,
height: 1,
elemId: 'dummy',
active: true,
updated: 2016-10-01T01:04:27.597Z
_id
看起来像一个十六进制数字。但是,_id 是 ObjectId,因为:
console.log( "adslot:\n" + adslot._id.constructor.name );
给予
adslot:
ObjectID
尽管 adslot
有 ObjectId
的构造函数调用 isValid()
( http://mongodb.github.io/node-mongodb native/2.2/api/ObjectID.html#.isValid ) 会给出错误:
console.log('adslot:');
console.log( adslot._id.isValid() );
结果:
adslot:
/home/vlad/arbsrv/node_modules/mongodb/lib/utils.js:98
process.nextTick(function() throw err; );
^
TypeError: adslot._id.isValid is not a function
那么,为什么console.log()
将_id
打印为数字而不是对象? toString()
是否以某种方式自动在 _id
上调用?
如果_id
是ObjectId
的实例,为什么上面没有定义isValid()
?
【问题讨论】:
好的,isValid 是 ObjectId 的静态方法,用作返回 true 的 ObjectId.isValid(adslot._id)。关于 console.log 的问题仍然存在。 【参考方案1】:isValid
是在 ObjectId
本身而不是它的原型上定义的。 ObjectId 的实例将没有此方法。尝试将其称为ObjectId.isValid()
以以下为例:
function ObjectId()
ObjectId.isValid = function()
return true;
ObjectId.prototype.sayHi = function()
return 'hello';
var a = new ObjectId();
a.sayHi(); // hello
a.isValid(); // raises exception
ObjectId.isValid(); // true
为什么 console.log() 将 _id 打印为数字而不是对象?
简短的回答,是的,它调用了 toString() 。有关更多详细信息,请查看此 SO answer。同样据我了解,ObjectId 原型上定义了一个 toString 方法,该方法将 _id 值作为字符串返回。
【讨论】:
根据您提到的答案:“只有当参数类型不是 undefined,null,object,set,map 类型之一时,FF 中的控制台 API 才会在参数上调用 toString()。”但是 typeof _id 返回“object”所以我不明白为什么 console.log() 会自动调用 toString() 。它是 NodeJs 中 Objectid() 对象的特殊补丁吗?以上是关于NodeJS 中 BSON 对象的 console.log的主要内容,如果未能解决你的问题,请参考以下文章