Há um problema com o gancho de pré-salvamento, em que 'this' deve mostrar o documento que está sendo salvo, mas fornece indefinido em vez disso.
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)
Qual poderia ser o erro?
PS: Salva normalmente quando o pré-gancho que está sendo usado não é usado.
A seta grande no ES6 vincula this
ao escopo léxico , que é apenas uma maneira elegante de dizer que this
dentro de uma função de seta é o mesmo que fora da função de seta. Use User.pre('save', function(next) {});
vez disso.
Existe uma maneira de obter o objeto com a função de seta ?, Eu usaria a 'função', mas um guia de estilo é imposto no projeto.
Infelizmente, não atm, os pre hooks contam explicitamente com a passagem do documento por this
vez de como um parâmetro. Flechas gordas não funcionam com este paradigma.
Comentários muito úteis
A seta grande no ES6 vincula
this
ao escopo léxico , que é apenas uma maneira elegante de dizer quethis
dentro de uma função de seta é o mesmo que fora da função de seta. UseUser.pre('save', function(next) {});
vez disso.