Mongoose: Pre-Save-Hook liefert kein Dokument

Erstellt am 2. Sept. 2015  ·  3Kommentare  ·  Quelle: Automattic/mongoose

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.

Hilfreichster Kommentar

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) {}); .

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen