Sequelize: Cannot set a new unique constraint 消息
Sequelize: Cannot set a new unique constraint message
我正在尝试为字段 username
和 email
设置违反唯一约束的验证消息。但是,无论何时输入已使用的用户名,它都会显示为 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"
}
}
如您所见,它表示用户名不是唯一的,而是使用为电子邮件 属性 定义的消息。
这是不可能的,因为它是模式验证器,而不是属于 validate: { }
对象的通用验证器。唯一的解决方法是包含 defaultValue: ''
,然后在 validate
对象中包含一个 notNull
对象。否则,仅删除 allowNull
会禁用大多数 validate: {}
检查。
isUnique(value) {
return User.findOne({where:{name:value}})
.then((name) => {
if (name) {
throw new Error('Validation error: name already exist');
}
})
}
这是可能的,试试这个
unique: {
arg: true,
msg: 'This username is already taken.'
},
我正在尝试为字段 username
和 email
设置违反唯一约束的验证消息。但是,无论何时输入已使用的用户名,它都会显示为 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"
}
}
如您所见,它表示用户名不是唯一的,而是使用为电子邮件 属性 定义的消息。
这是不可能的,因为它是模式验证器,而不是属于 validate: { }
对象的通用验证器。唯一的解决方法是包含 defaultValue: ''
,然后在 validate
对象中包含一个 notNull
对象。否则,仅删除 allowNull
会禁用大多数 validate: {}
检查。
isUnique(value) {
return User.findOne({where:{name:value}})
.then((name) => {
if (name) {
throw new Error('Validation error: name already exist');
}
})
}
这是可能的,试试这个
unique: {
arg: true,
msg: 'This username is already taken.'
},