Sequelizeのクラス定義をdefine
メソッドで書いていたのですが、バージョン4からclass定義の構文で書けるというウワサを聞いて試してみようと思いました。
しかしいくら調べてもちゃんとした書き方が見つからず苦労したのでまとめておきます。
#結論
こんな感じです
class User extends Sequelize.Model {
// クラスメソッド
static findByEmail(email) {
return this.findOne({ where: { email: email }})
}
// インスタンスメソッド
verifyPassword(password) {
return bcrypt.compare(password, this.password_hash)
}
}
User.init(
// フィールド
{
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true,
allowNull: false
},
name: {
type: Sequelize.STRING,
allowNull: false
},
password_hash: {
type: Sequelize.STRING,
allowNull: false
},
email: {
type: Sequelize.STRING,
allowNull: false
}
}, {
// オプション
freezeTableName: true,
underscored: true,
timestamps: true,
sequelize
}
)
クラスメソッド
クラスメソッドはstatic
をつけたメソッドとして書くことができます。
staticメソッドの中でthis
はUser
クラスを指します。
// クラスメソッド
User.findByEmail = function(email) {
return this.findOne({ where: { email: email }})
}
class User extends Sequelize.Model {
static findByEmail(email) {
return this.findOne({ where: { email: email }})
}
}
インスタンスメソッド
インスタンスメソッドは、モデルのプロトタイプに関数を登録していたのが、普通のメソッド定義になりました。
this
はUser
クラスのインスタンスを指します。
// インスタンスメソッド
User.prototype.verifyPassword = function(password) {
return bcrypt.compare(password, this.password_hash)
}
class User extends Sequelize.Model {
// インスタンスメソッド
verifyPassword(password) {
return bcrypt.compare(password, this.password_hash)
}
}
クラスメソッドもそうなのですが、従来の書き方でアロー演算子を使った書き方をしていたら、this
がグローバルオブジェクトになっていて困りました。function
を使って書かないとthis
はインスタンスを指してくれないみたいです。
「function
キーワードはもう使うな」って偉い人が言ってましたが、何も考えずにアロー演算子でインスタンスメソッドを書いてしまうとthis
がインスタンスを指してくれないので、オブジェクト指向なものを書く時はclass構文を使っていった方がよさそうです。
フィールド定義とオプション
sequelize.define('テーブル名', {フィールド定義}, {オプション})
User.init({フィールド定義}, {オプション})
Sequelizeバージョン4の新機能 っていうところに書いてましたが、この書き方を見つけることができなくて、長いこと苦しんでいました。
オプションにはsequelize
というキーでSequelizeのインスタンスを指定しないとエラーになります。これはよくわかんなかったですが、エラーになるので指定しましょう。
{
// オプション
freezeTableName: true,
underscored: true,
timestamps: true,
sequelize
}
実際に書き直した例
実際にモデルの定義をclass構文で書き直したときのコミットを貼っておきます。
https://github.com/mktoho12/myapp/commit/09f4c44a53c1d4f5453a122d6fcfa08c649b277f
現時点での各バージョン
- node 9.4.0
- sequelize 4.31.1