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

尽管 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()

【问题讨论】:

好的,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的主要内容,如果未能解决你的问题,请参考以下文章

字段必须是 BSON 类型的对象

Mongo JSON 文档 -> JSON -> BSON

nodejs 全局对象

在 mongoose + nodeJS 中检测到循环依赖

npm install mongoose 失败(kerberos 和 bson 错误)

字符串化Mongoose对象时nodejs“未定义”