2015-01-10 2 views
1

Может ли кто-нибудь сказать мне, как отдать документ, извлеченный из MongoDB, в класс, который я создал сам? Я не хочу использовать Mongoose, я использую github.com/christkv/mongodb-legacy v2.0.13Кастинг документа MongoDB строго типизированному классу

Значения документа, возвращенное из MongoDB

{ 
    id { MongoDb ID}, 
    email: '[email protected]', 
    passwordHash: '$2a$04$Wjan4CloaZRYj60MGsDb6e7x11e1QYkjW3N2q5JYBDaKBNipLti36', 
    passwordSalt: '$2a$04$Wjan4CloaZRYj60MGsDb6e', 
    id: 'mrpmorris' 
} 

Код, который не в состоянии выполнить

var user = Object.create(User.prototype, document) 

исключение брошено

TypeError: Property description must be an object: $2a$04$Wjan4CloaZRYj60MGsDb6e 
    at defineProperties (native) 
    at Function.create (native) 

класс пользователя

var assert = require('assert') 
var bcrypt = require('bcrypt') 

var User = (function() { 
    function User() { 
     this.passwordSalt = "hello" 
    } 

    User.prototype.constructor = User 
    User.prototype.setPassword = function (newPassword, callback) { 
     var self = this 
     assert.ok(newPassword != null, "newPassword cannot be null") 
     assert.ok(newPassword.length >= 8) 
     bcrypt.genSalt(2, function (err, salt) { 
      self.passwordSalt = salt 
      bcrypt.hash(newPassword, salt, function (err, hash) { 
       self.passwordHash = hash 
       callback(err); 
      }) 
     }); 
    } 

    User.prototype.checkPassword = function (password, callback) { 
     var self = this 
     bcrypt.hash(self.passwordHash, self.passwordSalt, function (err, hash) { 
      callback(err, hash === self.passwordHash) 
     }) 
    } 


    return User 
})() 

exports.User = User 
+1

Почему бы вам не взять пользовательский документ в качестве параметра в конструкторе? – cbass

ответ

3

Вы получаете сообщение об ошибке, потому что Object.create ожидает свойства описатель в качестве второго параметра, СТГ как

var doc = { 
    email: '[email protected]', 
    passwordHash: '$2a$04$Wjan4CloaZRYj60MGsDb6e7x11e1QYkjW3N2q5JYBDaKBNipLti36', 
    passwordSalt: '$2a$04$Wjan4CloaZRYj60MGsDb6e', 
    id: 'mrpmorris' 
}; 

var user = Object.create(User.prototype, { 
    // regular 'value property' 
    email:  { writable: true, configurable: true, value: doc.email  }, 
    passwordHash: { writable: true, configurable: true, value: doc.passwordHash }, 
    passwordSalt: { writable: true, configurable: true, value: doc.passwordSalt }, 
    id:   { writable: true, configurable: true, value: doc.id   } 
}); 

Пожалуйста, обратитесь к MDN Подробности

Альтернативно, как @cbass предложил, вы можете передать объект документа mongo до User конструктор

function User(doc) { 
    this.id = doc.id; 
    this.email = doc.email; 
    this.passwordHash = doc.passwordHash; 
    this.passwordSalt = doc.passwordSalt; 
} 
//... 
var user = new User(doc); 
+0

Спасибо за всесторонний ответ! Я решил вместо этого удалить мою модель и просто создать функции, которые выполняют операции с документами –

Смежные вопросы