2016-06-16 4 views
1

EDIT: Я обнаружил, что console.log(this), запущенный внутри метода setPassword, возвращает только хэш и соль. Я не уверен, почему это происходит, но это указывает на то, что this не относится к модели, как следует.Метод экземпляра Mongoose `this` не относится к модели


Я следующая схема со следующим методом экземпляра:

let userSchema = new mongoose.Schema({ 
    username: {type: String, required: true}, 
    email: {type: String, required: true, index: {unique: true}}, 
    joinDate: {type: Date, default: Date.now}, 
    clips: [clipSchema], 
    hash: {type: String}, 
    salt: {type: String} 
}) 

userSchema.methods.setPassword = (password) => { 
    this.salt = crypto.randomBytes(32).toString('hex') 
    this.hash = crypto.pbkdf2Sync(password, this.salt, 100000, 512, 'sha512').toString('hex') 
} 

Метод экземпляра называется здесь, то пользователь будет сохранен:

let user = new User() 

user.username = req.body.username 
user.email = req.body.email 
user.setPassword(req.body.password) 

user.save((err) => { 
    if (err) { 
    sendJsonResponse(res, 404, err) 
    } else { 
    let token = user.generateJwt() 
    sendJsonResponse(res, 200, { 'token': token }) 
    } 
}) 

Однако при просмотре users коллекция в монго CLI, нет упоминания о hash или salt.

{ 
"_id" : ObjectId("576338b363bb7df7024c044b"), 
"email" : "[email protected]", 
"username" : "Bob", 
"clips" : [ ], 
"joinDate" : ISODate("2016-06-16T23:39:31.825Z"), 
"__v" : 0 
} 
+1

Попробуйте использовать 'userSchema.methods.setPassword = функция (пароль) {...}' – Kairat

ответ

5

Причина, по которой он не работал, был потому, что я использовал метод стрелки. Я должен был сделать его нормальную функцию:

userSchema.methods.setPassword = function (password) {

Причина заключается в том, потому что стрелка функции лечения this отличается от обычных функций. Пожалуйста, смотрите следующие более подробно:

http://exploringjs.com/es6/ch_arrow-functions.html

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