2016-12-30 5 views
2

Я смущен тем, как console.log отображает объекты ObjectId() из собственного драйвера MongoDB для NodeJS.console.log объектов BSON в NodeJS

Я распечатать adslot документ из MongoDB с console.log:

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 нативный/2,2/апи/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

Ok, isValid является статическим методом ObjectId и используется как ObjectId.isValid (adslot._id), который возвращает true. Остается вопрос о console.log. – rlib

ответ

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 как строку.

+0

В соответствии с ответом вы упомянули: «Консольный API в FF вызывает toString() для аргумента, только если тип аргумента не является одним из типов {undefined, null, object, set, map}." Но typeof _id возвращает «объект», поэтому я не понимаю, почему console.log() автоматически вызывает toString() на нем. Это специальный патч для объектов Objectid() в NodeJs? – rlib