web-dev-qa-db-ja.com

Sequelizeでインスタンスメソッドを使用する

誰かがSequelizeでインスタンスメソッドを使用する方法を理解するのに役立ちますか?ドキュメントを確認しましたが、まばらであることがわかりました。現在、ユーザーモデルでsetPasswordおよびverifyPasswordインスタンスメソッドを使用しようとしています。 REPLでコードを呼び出そうとすると、ユーザーモデルをインポートしてDBを同期した後、次のようになります。

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

ユーザーモデルのコードは次のとおりです。

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

インスタンスメソッドは、特定の要素インスタンスで使用できます。

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

関数は次のように定義します:function(password, done)

ただし、doneパラメータは指定しません。したがって、関数は、doneを未定義として残し、done()を呼び出すと、未定義の関数が実行されます。

これは3つの方法で修正できます。

  1. Noop関数に対して行われるデフォルトfunction () {}
  2. Doneが定義されている場合にのみdone()を返します
  3. インスタンス関数を呼び出すときに、doneコールバックを提供します。

代替策は、リファクタリングして、完了時に解決するpromiseを返すことです。

3
Pyro