【问题标题】:Can Sequelize use something like a getter or setter in a find query?Sequelize 可以在查找查询中使用 getter 或 setter 之类的东西吗?
【发布时间】:2022-01-14 20:52:26
【问题描述】:

对于我的电子邮件字段,我将电子邮件存储和查询为小写字符串,以避免重复电子邮件,例如 user@example.comUser@example.com。我在我的模型中定义了一个 set 方法,例如:

const User = sequelize.define('user', {
  email: {
    type: DataTypes.STRING,
    unique: { msg: 'That email is already registered.' },
    validate: { isEmail: { msg: 'Invalid email.' } },
    set(value) {
      this.setDataValue('email', value.toLowerCase().trim())
    }
  }
})

这可以防止使用大写字母设置电子邮件,但不会防止使用大写字母进行查询。为了避免查询,我必须记住在任何地方都使用.toLowerCase()。如果我可以在模型上定义它会更好,这样这样的查询就可以工作:

const user = await User.findOne({ where: { email: 'SomeEmail@example.com' } })

【问题讨论】:

    标签: javascript node.js postgresql express sequelize.js


    【解决方案1】:

    您可以在模型中使用hooks 以小写形式存储电子邮件。 请看下面的例子

    const createUserModel = (sequelize, { STRING, UUIDV4, UUID, DATE }) => {
      const User = sequelize.define(
        'User',
        {
          userId: {
            type: UUID,
            defaultValue: UUIDV4,
            primaryKey: true,
          },
          email: {
            type: STRING,
            allowNull: false,
            unique: true,
            validate: {
              isEmail: true,
            },
          },
          password: {
            type: STRING,
            allowNull: true,
          },
        },
        {
          freezeTableName: true,
          timestamps: false,
          hooks: {
            beforeCreate: async instance => {
              const email = instance.get('email');
              instance.set('email', email.toLowerCase());
            },
            beforeUpdate: async instance => {
              if (instance.changed('email')) {
                const email = instance.get('email');
                instance.set('email', email.toLowerCase());
              }
            },
          },
        },
      );
    
      return User;
    };
    
    module.exports = {
      createUserModel,
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多