NodeJS中的BSON对象的console.log

时间:2016-12-30 17:18:58

标签: node.js mongodb bson

我对控制台.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

尽管adslotObjectId的构造函数调用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吗?

为什么如果_idObjectId的实例,isValid()没有定义呢?

1 个答案:

答案 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值作为字符串返回。