我对控制台.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()
没有定义呢?
答案 0 :(得分:0)
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值作为字符串返回。