我得到这个错误:
Unhandled rejection SequelizeUniqueConstraintError: Validation error
我该怎么解决这个问题?
这是我的models/user.js
"use strict";
module.exports = function(sequelize, DataTypes) {
var User = sequelize.define("User", {
id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true},
name: DataTypes.STRING,
environment_hash: DataTypes.STRING
}, {
tableName: 'users',
underscored: false,
timestamps: false
}
);
return User;
};
这是我的routes.js:
app.post('/signup', function(request, response){
console.log(request.body.email);
console.log(request.body.password);
User
.find({ where: { name: request.body.email } })
.then(function(err, user) {
if (!user) {
console.log('No user has been found.');
User.create({ name: request.body.email }).then(function(user) {
// you can now access the newly created task via the variable task
console.log('success');
});
}
});
});
7条答案
按热度按时间mpgws1up1#
对
User.create()
的调用返回一个Promise.reject()
,但没有.catch(err)
来处理它。如果不捕获错误并知道输入值,就很难说出验证错误是什么--request.body.email
可能太长,等等。捕获Promise reject以查看错误/验证详细信息
更新,因为现在是2019年,你可以使用async/await
gr8qqesn2#
检查你的数据库,如果你有一个唯一约束创建,我的猜测是,你把一些值
unique: true
和改变它,但sequelize无法删除它的约束从您的数据库。axzmvihb3#
我的QA数据库有这个问题。有时新记录会保存到数据库,有时会失败。当在我的开发工作站上执行相同的过程时,它每次都会成功。
当我捕捉到错误(根据@doublesharp的好建议)并将完整结果打印到控制台时,它确认违反了唯一约束-特别是主键id列,该列被设置为默认值自动递增。
我在数据库中植入了记录,尽管这些记录的id也设置为自动递增,但200多条记录的id分散在1到2000之间,但数据库的自动递增序列设置为从1开始。通常,序列中的下一个id未使用,但偶尔它已经被占用,数据库将返回此错误。
我使用答案here将序列重置为在最后一个种子记录之后开始,现在每次都有效。
qyzbxkaa4#
当使用SQLite作为数据库时,Sequelize(当前为5.21.5)在 * 每个约束错误 * 上抛出
SequelizeUniqueConstraintError
,即使它与唯一索引无关。一个例子是将NULL
插入到不可为空的列中。因此,在调试此异常时,请确保还检查其他类型的错误。8i9zcol25#
基于@Ricardo马查多的答案,如果你将
unique:true
添加到一个模型中,并且在现有的表中已经有了在这个新约束下不允许的值,你会得到这个错误。要修复,您可以手动删除行或删除表,然后Sequelize再次构建它。ie3xauqp6#
如果你偶然发现这个来自Sequelize的
Validation error
:检查填充(创建)表的查询是否执行一次。我的Nest.js应用程序没有正确设置,并且执行了两次相同的命令,因此违反了唯一约束。
sauutmhj7#
在我使用PostgreSQL的例子中,当使用sequelize创建时收到了这个错误,并且在用于创建的模型中没有找到定义为唯一约束的列。
跟踪后,问题发生在id列,它应该是autoIncrement,但当我检查数据库时,发现我使用的表有一个不完整的id,这是因为有人通过手动创建访问数据库,但PostgreSQL无法自动处理这一点。
要解决这个问题,您可以
reset auto increment counter
或按照以下步骤操作:1.指定要重置的序列的名称。您可以通过运行查询来查看序列的名称:
SELECT pg_get_serial_sequence('table_name ','column_name ');
1.获得序列名称后,使用ALTER SEQUENCE命令重置自动递增计数器。下面是命令的格式:
ALTER SEQUENCE序列名RESTART WITH新值;
1.在PostgreSQL客户端中执行ALTER SEQUENCE命令,例如通过psql或通过支持SQL命令执行的数据库管理工具。