Sequelize - 模型属性设置器方法不起作用

时间:2017-05-10 11:18:53

标签: sequelize.js

我的表中有一个列,它将使用散列模块来散列(字符和整数)表上的自动递增主键。我尝试使用散列模式属性的getset方法来实现此目的,但是永远不会设置该值。

var Hashids = require('hashids');
var hashids = new Hashids('blog', 10);

var blogComment = sequelize.define('blog_comment', {
    blogCommentId: {
        type: DataTypes.INTEGER,
        field: 'blog_comment_id',
        autoIncrement: true,
        primaryKey: true
    },
    blogCommentIdHash: {
        type: DataTypes.STRING,
        field: 'blog_comment_id_hash',
        get: function(){
            var blogCommentId = this.getDataValue('blogCommentId');
            return this.setDataValue('blogCommentIdHash', hashids.encode(blogCommentId));
        }
    }, 

...

}

我还尝试了一种不同的设置,我将set方法附加到具有类似功能的id属性,但仍然没有成功。

var Hashids = require('hashids');
    var hashids = new Hashids('blog', 10);

    var blogComment = sequelize.define('blog_comment', {
        blogCommentId: {
            type: DataTypes.INTEGER,
            field: 'blog_comment_id',
            autoIncrement: true,
            primaryKey: true,
            set: function(val){
              return this.setDataValue('blogCommentIdHash', hashids.encode(val));
            }
        },
        blogCommentIdHash: {
            type: DataTypes.STRING,
            field: 'blog_comment_id_hash'
        }, 

    ...

    }

这些方法我做错了什么?

1 个答案:

答案 0 :(得分:1)

对于Sequelize getter和setter,您需要使用以下语法:

clientStartDate:{
        type: Sequelize.DATE,
        allowNull: false,
        validate:{
            isDate: true,
            isAfter: "6/24/2018"
        },
        get(){
            this.getDataValue('clientStartDate');
        },
        set(date){
            //set date so it's value only contains a Date and No Time
            console.log("DATE: "+ date);
            date = new Date(date.getFullYear(), date.getMonth(), date.getDate());
            this.setDataValue("clientStartDate",date);
        }

请注意,在函数名称(即get()和set(parameter))之后如何加上括号。在setter函数中,您也不需要返回setDataValue()的值。另外,不要犯错误使用this.getDataValue('property_name')在setter函数中检索值,因为在模型调用set()函数之前尚未将原始值分配给该property_name。始终通过set()参数检索要尝试操作的值。

我还将研究在模型中使用另一种实现getter / setter方法的形式(如文档所示):

const Foo = sequelize.define('foo', {
  firstname: Sequelize.STRING,
  lastname: Sequelize.STRING
  }, {
  getterMethods: {
    fullName() {
      return this.firstname + ' ' + this.lastname
    }
  },

  setterMethods: {
    fullName(value) {
      const names = value.split(' ');

      this.setDataValue('firstname', names.slice(0, -1).join(' '));
      this.setDataValue('lastname', names.slice(-1).join(' '));
    },
  }
});