web-dev-qa-db-fra.com

Utiliser des méthodes d'instance dans la séquelle

Quelqu'un peut-il m'aider à comprendre comment utiliser des méthodes d'instance dans la séquelle? J'ai examiné la documentation mais j'ai trouvé qu'il était rare. À l'heure actuelle, j'essaie d'utiliser des méthodes d'instance SetPassword et Verifypassword sur mon modèle utilisateur. Lorsque j'essaie d'appeler le code dans la RÉPL, après avoir importé le modèle utilisateur et synchronisé la DB, je reçois ce qui suit:

> models.User.setPassword('test');
TypeError: Object [object Object] has no method 'setPassword'

Voici le code du modèle utilisateur:

var bcrypt = require('bcrypt');

module.exports = function(sequelize, DataTypes) {
  return sequelize.define('User', {
    email: { type: DataTypes.STRING, unique: true, allowNull: false, validate: { isEmail: true } },
    password: { type: DataTypes.STRING, allowNull: false},
    firstName: {type: DataTypes.STRING},
    lastName: {type: DataTypes.STRING},
    companyName: {type: DataTypes.STRING},
    admin: {type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false,},
    forgotUrl: {type: DataTypes.STRING, unique: true},
    forgotDate: {type: DataTypes.STRING},
    lastLogin: {
      type: DataTypes.DATE,
      defaultValue: DataTypes.NOW
    }
  }, {
    paranoid: true,
    instanceMethods: {
      setPassword: function(password, done) {
        return bcrypt.genSalt(10, function(err, salt) {
          return bcrypt.hash(password, salt, function(error, encrypted) {
            this.password = encrypted;
            this.salt = salt;
            return done();
          });
        });
      },
      verifyPassword: function(password, done) {
        return bcrypt.compare(password, this.password, function(err, res) {
          return done(err, res);
        });
      }
    }
  });
};
20
surfearth

La méthode d'instance peut être utilisée sur des instances d'éléments spécifiques, par exemple.

models.User.find(123).success( function( user ) { 
    user.setPassword('test');
});
16
SergeS

Vous définissez la fonction comme suit: function(password, done)

Pourtant, vous ne fournissez pas le paramètre fait. Ainsi, la fonction se laisse effectuée comme non définie et appelée terminée () exécute une fonction non définie.

Vous pouvez résoudre ce problème de 3 manières:

  1. Par défaut fait à une fonction noop function () {}
  2. Seulement retour done() si c'est fini est défini
  3. Fournissez un rappel fait lorsque vous appelez la fonction d'instance.

L'alternative est de le refroidir pour retourner une promesse qu'il résout la finalité.

3
Pyro