【问题标题】:Sequelize: Cannot set a new unique constraint messageSequelize:无法设置新的唯一约束消息
【发布时间】:2016-03-19 16:50:59
【问题描述】:

我正在尝试为字段 usernameemail 设置违反唯一约束的验证消息。但是,无论何时输入已使用的用户名,它都会显示为email 属性定义的消息,但会显示username 属性的输入,并且还会显示此输入用于username 属性。我将如何解决这个问题?这是我的代码:

module.exports = function (sequelize, DataTypes) {
    var users = sequelize.define('users', {
        full_name: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                len: {
                    args: [5, 50],
                    msg: 'Your full name may be 5 to 50 characters only.'
                }
            }
        },
        email: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: {
                msg: 'This email is already taken.'
            },
            validate: {
                isEmail: {
                    msg: 'Email address must be valid.'
                }
            }
        },
        username: {
            type: DataTypes.STRING,
            allowNull: false,
            unique: {
                msg: 'This username is already taken.'
            },
            validate: {
                len: {
                    args: [5, 50],
                    msg: 'Your username may be 5 to 50 characters only.'
                }
            }
        },
        password: {
            type: DataTypes.STRING,
            allowNull: false,
            validate: {
                len: {
                    args: [5, 72],
                    msg: 'Your password may be 5 to 72 characters only.'
                }
            }
        },
        rank: {
            type: DataTypes.INTEGER,
            allowNull: false,
            validate: {
                isInt: true
            }
        }
    }, {
        hooks: {
            beforeValidate: function (user, options) {
                if (typeof user.email === 'string') {
                    user.email = user.email.toLowerCase();
                }

                if (typeof user.username === 'string') {
                    user.username = user.username.toLowerCase();
                }
            }
        }
    });

    return users;
};

这是我从输入中得到的输出:

{
  "name": "SequelizeUniqueConstraintError",
  "message": "Validation error",
  "errors": [
    {
      "message": "This email is already taken.",
      "type": "unique violation",
      "path": "username",
      "value": "hassan"
    }
  ],
  "fields": {
    "username": "hassan"
  }
}

如您所见,它表示用户名不是唯一的,而是使用为电子邮件属性定义的消息。

【问题讨论】:

标签: javascript node.js sequelize.js


【解决方案1】:

这是不可能的,因为它是一个模式验证器,而不是属于validate: { } 对象的通用验证器。唯一的解决方法是包含defaultValue: '',然后在validate 对象中包含一个notNull 对象。否则,仅删除 allowNull 会禁用大多数 validate: {} 检查。

【讨论】:

    【解决方案2】:

    isUnique(value) {
              
              return User.findOne({where:{name:value}})
                .then((name) => {
                  if (name) {
                    throw new Error('Validation error: name already exist');
                  }
                })
            }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-12
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      相关资源
      最近更新 更多