Как работают секвел-геттер и сеттер?


Резюме вопроса: концептуально, что такое геттеры и сеттеры и почему мы должны их использовать?

Отрывок из http://docs.sequelizejs.com/en/latest/docs/models-definition/?highlight=getterMethods#getters-setters:

В ваших моделях можно определить геттеры "объект-свойство" и функции setter, которые могут использоваться как для "защиты" свойств, отображаемых в поля базы данных, так и для определения "псевдо" свойства.

  1. Что значит "защищать"? Против чего?

  2. Что такое свойства "psuedo"?

Я также борюсь с приведенным ниже примером кода. Мы, кажется, устанавливаем "название" дважды. А что такое аргумент "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! */ },
  }
});

Конкретный пример вместо "колдовать" был бы очень признателен!

1 19

1 ответ:

Псевдо свойства

Будут свойства, которые с точки зрения пользователя кажутся обычными свойствами объекта, но не существуют в базе данных. Возьмем, к примеру, объект пользователя, имеющий поля " Имя " и "фамилия". Затем можно создать сеттер полного имени:

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) 

Чтобы увидеть полное имя пользователя. Затем добытчик вызывается за кулисами.

Аналогично, если вы определите метод setter для полного имени, который вы могли бы сделать

user.fullName = 'John Doe'

, который затем разделит переданную строку на две части и сохранит их в имени и фамилии. (см. упрощенный пример выше)

Защита свойств

@ahiipsa уже привел хороший пример этого. Геттеры вызываются, когда вы делаете пользователя.toJSON (), так что вы можете использовать геттеры, чтобы легко удалить конфиденциальные данные перед отправкой их пользователю.