web-dev-qa-db-ja.com

sequelizeゲッターとセッターはどのように機能しますか?

質問の概要:概念的には、ゲッターとセッターとは何で、なぜそれらを使用するのですか?

http://docs.sequelizejs.com/en/latest/docs/models-definition/?highlight=getterMethods#getters-setters からの抜粋:

モデルで「object-property」ゲッターおよびセッター関数を定義することが可能です。これらは、データベースフィールドにマップする「保護」プロパティと「疑似」プロパティの定義の両方に使用できます。

  1. 「保護」とはどういう意味ですか?何に対して?

  2. 「疑似」プロパティとは何ですか?

以下のコード例にも苦労しています。 「タイトル」を2回設定しているようです。そして、引数「v」は何ですか?

下記参照:

var Foo = sequelize.define('Foo', {
  title: {
    type     : Sequelize.STRING,
    allowNull: false,
  }
}, {

  getterMethods   : {
    title       : function()  { /* do your magic here and return something! */ },
    title_slug  : function()  { return slugify(this.title); }
  },

  setterMethods   : {
    title       : function(v) { /* do your magic with the input here! */ },
  }
});

「マジックを行う」の代わりに具体的な例をいただければ幸いです!

23
user2316667

疑似プロパティ

ユーザーの観点からは、オブジェクトの通常のプロパティのように見えますが、データベースには存在しないプロパティになります。たとえば、名と姓のフィールドを持つユーザーオブジェクトを考えてみます。次に、フルネームセッターを作成できます。

var foo = sequelize.define('foo', {
    ..
}, {
    getterMethods: {
        fullName: function () {
            return this.getDataValue('firstName') + ' ' + this.getDataValue('lastName')
        }
    },
    setterMethods: {
        fullName: function (value) {
            var parts = value.split(' ')

            this.setDataValue('lastName', parts[parts.length-1])
            this.setDataValue('firstName', parts[0]) // this of course does not work if the user has several first names
        }
    }
})

あなたがユーザーオブジェクトを持っているとき、あなたは簡単に行うことができます

console.log(user.fullName) 

ユーザーのフルネームを表示します。次に、ゲッターがバックグラウンドで呼び出されます。

同様に、フルネームのセッターメソッドを定義すると、

user.fullName = 'John Doe'

次に、渡された文字列を2つの部分に分割し、姓名で保存します。 (上記の簡略化された例を参照)

プロパティを保護する

@ahiipsaはこの良い例をすでに提供しています。 getterはuser.toJSON()を実行すると呼び出されるため、getterを使用して、機密データをユーザーに送信する前に簡単に削除できます。

32