在没有存储的Sequelize中创建模型属性

时间:2015-05-08 18:50:11

标签: node.js sequelize.js

我使用Sequelize作为我的ORM。我想创建一个具有没有相关存储的属性的模型(即没有相应的表列)。这些属性可能包含getter和setter,也可能有验证。

如何在.save()上创建不会存储到光盘的实例级属性?

情景

我有一个LocalLogins模型。我的模型有usernamesalt,盐渍password和无保留rawPassword。每次设置password时,都会对该值进行加盐和散列。哈希的结果成为新密码。原始“原始”值将保存到rawPassword

我不想存储未加密的rawPassword,但只要在调用.save()时用于验证。这允许模型要求具有一定强度的密码。

尝试

我尝试将字段设置为'',但遗憾的是没有效果。

var LocalLogin = sequelize.define('LocalLogin', {
  username: {
    allowNull: false,
    field: 'username',
    type: DataTypes.STRING,
  },
  password: {
    allowNull: false,
    field: 'password',
    type: DataTypes.STRING,
  },
  rawPassword: {
    field: '',
    type: DataTypes.STRING
  },
  salt: {
    allowNull: false,
    defaultValue: function() {
      var buf = crypto.randomBytes(32);
      return buf.toString('hex');
    },
    field: 'salt',
    type: DataTypes.STRING,
    }
}, {
  getterMethods: {
    password: function() { return undefined; },
    rawPassword: function() { return undefined; },
    salt: function() { return undefined; }
  },
  setterMethods: {
    password: function(val) {
      // Salt and hash the password
      this.setDataValue('rawPassword', val);
      if(typeof val === 'string')
        this.setDataValue('password', hash(val + this.getDataValue('selt')));
    },
    salt: function(val) {
      // Salt cannot be modified
      return null;
    }
  },
  validate: {
    passwordCheck: function() {
      // Has a new password been set?
      if(this.getDataValue('rawPassword') == null)
        return

      // Did they try to set the password as something other than a string?
      if(typeof this.getDataValue('rawPassword') !== 'string')
        throw new Error('Password must be a string');

      // Make sure the password is long enough
      if(this.getDataValue('rawPassword').length < 6)
        throw new Error('Password must be longer than six characters.');
    }
  }
});

1 个答案:

答案 0 :(得分:1)