Возникла проблема с обработчиком pre save, где this должно выдавать мне сохраняемый документ, но вместо этого возвращает undefined.
import mongo from 'mongoose'
import crypt from 'bcryptjs'
const User = new mongo.Schema({
username: {type: String, unique: true, required: true},
password: {type: String, select: false, required: true}
// token: {type: String}
})
//
User.pre('save', (next) => {
console.log(this);
if (this.isModified('password') || this.isNew) {
crypt.genSalt(10, (err, salt) => {
if (err) {
next(err)
} else {
crypt.hash(user.password, salt, (err, hash) => {
if (err) {
next(err)
} else {
user.password = hash
next()
}
})
}
})
} else {
next()
}
})
export default mongo.model('User', User)
В чем может быть ошибка?
PS: Обычно сохраняется, когда предварительный крючок не используется.
Толстая стрелка в ES6 связывает this
с лексической областью видимости , что является просто причудливым способом сказать, что this
внутри стрелочной функции то же самое, что и вне стрелочной функции. Вместо этого используйте User.pre('save', function(next) {});
.
Есть ли способ получить объект с помощью функции стрелки? Я бы использовал «функцию», но в проекте наложено руководство по стилю.
К сожалению, не atm, предварительные хуки явно полагаются на передачу документа через this
а не как параметр. Толстые стрелки не работают с этой парадигмой.
Самый полезный комментарий
Толстая стрелка в ES6 связывает
this
с лексической областью видимости , что является просто причудливым способом сказать, чтоthis
внутри стрелочной функции то же самое, что и вне стрелочной функции. Вместо этого используйтеUser.pre('save', function(next) {});
.