2017-05-13 10 views
0

私は私が私のUserモデルに定義したgenerateHashインスタンスメソッドを呼び出すしようとすると、私は次のエラーを取得する:はSequelizeインスタンスメソッドにアクセスすることはできません

const User = sequelize.define('User', 
{ 
    firstName: { 
     type: Sequelize.TEXT, 
     field: 'first_name' 
    }, 
    lastName: { 
     type: Sequelize.TEXT, 
     allowNull: false, 
     field: 'last_name' 
    }, 
    userName: { 
     type: Sequelize.TEXT, 
     field: 'user_name', 
     allowNull: false 
    }, 
    password: { 
     type: Sequelize.TEXT, 
     allowNull: false 
    } 
}, { 
    tableName: 'users', 
    underscored: true, 
    classMethods: { 
     associate: function(models) { 
      User.hasMany(
     models.Trip, 
       { 
        as: 'trips', 
        foreignKey: { 
         name: 'userId', 
         field: 'user_id', 
         allowNull: false 
        }, 
        onDelete: 'CASCADE' 
       }); 
     }, 
    }, 
    instanceMethods: { 
     generateHash: function(password) { 
      return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
     }, 
     validatePassword: function(password) { 
      return bcrypt.compareSync(password, this.password); 
     }, 
     apiRepr: function() { 
      return { 
       id: this.id, 
       firstName: this.firstName, 
       lastName: this.lastName, 
       userName: this.userName 
      }; 
     } 
    } 
}); 

User.generateHash(...).then is not a function

ここでモデルの定義そのものです

ここで私はメソッドを呼び出そうとするエンドポイントです:

router.post('/', (req, res) => { 
let {userName, password, firstName, lastName} = req.body; 

// if no existing user, hash password 
return User.generateHash(password) 
    .then(hash => { 
     // create new user 
     return User.create({ 
      firstName: firstName, 
      lastName: lastName, 
      userName: userName, 
      password: hash 
     }); 
    }) 
    .then(user => { 
     // send back apirRepr data 
     return res.status(201).json(user.apiRepr()); 
    }) 
    // error handling 
    .catch(err => { 
     if (err.name === 'AuthenticationError') { 
      return res.status(422).json({message: err.message}); 
     } 
     res.status(500).json({message: 'Internal server error'}); 
    });}); 

私は完全に立ち往生しています。何か案は?

答えて

1

あなたは約束を返さないものに対して.then()を呼び出しています。これを試してみてください:

router.post('/', (req, res) => { 
let {userName, password, firstName, lastName} = req.body; 
let hash = User.generateHash(password); 
// if no existing user, hash password 
return User.create({ 
     firstName: firstName, 
     lastName: lastName, 
     userName: userName, 
     password: hash 
    }) 
    .then(user => { 
     // send back apirRepr data 
     return res.status(201).json(user.apiRepr()); 
    }) 
    // error handling 
    .catch(err => { 
     if (err.name === 'AuthenticationError') { 
      return res.status(422).json({message: err.message}); 
     } 
     return res.status(500).json({message: 'Internal server error'}); 
    }); 
+0

ありがとう: は今、あなたは、このようにそれをしなければなりません!私も同様のソリューションを実装しました。 –

1

sequelizeでV4クラスとインスタンスメソッドが削除されます。

const Model = sequelize.define('Model', { 
 
    ... 
 
}); 
 

 
// Class Method 
 
Model.associate = function (models) { 
 
    ...associate the models 
 
}; 
 

 
// Instance Method 
 
Model.prototype.someMethod = function() {..}

詳しい情報ここSequelize v4 breaking changes

関連する問題