NodeJS的sequelize获取和设置器

419 阅读2分钟

这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

获取器, 设置器 和 虚拟字段

Sequelize 允许模型的属性定义自定义获取器和设置器.

Sequelize 还允许指定 虚拟属性,它们是 Sequelize 模型上的属性,这些属性在基础 SQL 表中实际上并不存在,而是由 Sequelize 自动填充

获取器

获取器是为模型定义中的一列定义的 get() 函数:

const User = sequelize.define('user', {
  // 假设我们想要以大写形式查看每个用户名,
  // 即使它们在数据库本身中不一定是大写的
  username: {
    type: DataTypes.STRING,
    get() {
      const rawValue = this.getDataValue('username');
      return rawValue ? rawValue.toUpperCase() : null;
    }
  }
});

在读取字段值时会自动调用此获取器:

const user = User.build({ username: 'SuperUser123' });
console.log(user.username); // 'SUPERUSER123'
console.log(user.getDataValue('username')); // 'SuperUser123'

注意,记录为 SUPERUSER123,但是真正存储在数据库中的值仍然是 SuperUser123,使用了 this.getDataValue('username') 来获得该值,并将其转换为大写.

设置器

设置器是为模型定义中的一列定义的 set() 函数. 接收要设置的值:

const User = sequelize.define('user', {
  username: DataTypes.STRING,
  password: {
    type: DataTypes.STRING,
    set(value) {
      // 在数据库中以明文形式存储密码是很糟糕的.
      // 使用适当的哈希函数来加密哈希值更好.
      this.setDataValue('password', hash(value));
    }
  }
});

Sequelize 在将数据发送到数据库之前自动调用了设置器. 数据库得到的唯一数据是已经散列过的值.

如果想将模型实例中的另一个字段包含在计算

const User = sequelize.define('user', {
  username: DataTypes.STRING,
  password: {
    type: DataTypes.STRING,
    set(value) {
      // 在数据库中以明文形式存储密码是很糟糕的.
      // 使用适当的哈希函数来加密哈希值更好.
      // 使用用户名作为盐更好.
      this.setDataValue('password', hash(this.username + value));
    }
  }
});

组合获取器和设置器

获取器和设置器都可以在同一字段中定义.

虚拟字段

虚拟字段是 Sequelize 在后台填充的字段,但实际上它们不存在于数据库中, Sequelize 在模型定义中还提供了 getterMethods 和 setterMethods 参数,以指定看起来像但与虚拟属性不完全相同的事物.