Es gibt ein Problem mit dem Pre-Save-Hook, bei dem 'this' mir das zu speichernde Dokument geben sollte, aber stattdessen 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)
Was könnte der Fehler sein?
PS: Es speichert normalerweise, wenn der Pre-Hook nicht verwendet wird.
Fat arrow in ES6 bindet this
an den lexikalischen Geltungsbereich , was nur eine ausgefallene Art ist, zu sagen, dass this
innerhalb einer Pfeilfunktion dasselbe ist wie außerhalb der Pfeilfunktion. Verwenden Sie stattdessen User.pre('save', function(next) {});
.
Gibt es eine Möglichkeit, das Objekt mit der Pfeilfunktion zu erhalten? Ich würde die 'Funktion' verwenden, aber ein Styleguide wird im Projekt auferlegt.
Leider nicht atm, pre-Hooks verlassen sich explizit darauf, das Dokument durch this
statt als Parameter zu übergeben. Fette Pfeile funktionieren mit diesem Paradigma nicht.
Hilfreichster Kommentar
Fat arrow in ES6 bindet
this
an den lexikalischen Geltungsbereich , was nur eine ausgefallene Art ist, zu sagen, dassthis
innerhalb einer Pfeilfunktion dasselbe ist wie außerhalb der Pfeilfunktion. Verwenden Sie stattdessenUser.pre('save', function(next) {});
.