mysql 未处理的拒绝SequelizeUniqueConstraintError:验证错误

neskvpey  于 2023-06-28  发布在  Mysql
关注(0)|答案(7)|浏览(166)

我得到这个错误:

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');
                        });

                } 
            });


    });
mpgws1up

mpgws1up1#

User.create()的调用返回一个Promise.reject(),但没有.catch(err)来处理它。如果不捕获错误并知道输入值,就很难说出验证错误是什么--request.body.email可能太长,等等。

捕获Promise reject以查看错误/验证详细信息

User.create({ name: request.body.email })
.then(function(user) {
    // you can now access the newly created user
    console.log('success', user.toJSON());
})
.catch(function(err) {
    // print the error details
    console.log(err, request.body.email);
});

更新,因为现在是2019年,你可以使用async/await

try {
  const user = await User.create({ name: request.body.email });
  // you can now access the newly created user
  console.log('success', user.toJSON());
} catch (err) {
  // print the error details
  console.log(err, request.body.email);
}
gr8qqesn

gr8qqesn2#

检查你的数据库,如果你有一个唯一约束创建,我的猜测是,你把一些值unique: true和改变它,但sequelize无法删除它的约束从您的数据库。

axzmvihb

axzmvihb3#

我的QA数据库有这个问题。有时新记录会保存到数据库,有时会失败。当在我的开发工作站上执行相同的过程时,它每次都会成功。
当我捕捉到错误(根据@doublesharp的好建议)并将完整结果打印到控制台时,它确认违反了唯一约束-特别是主键id列,该列被设置为默认值自动递增。
我在数据库中植入了记录,尽管这些记录的id也设置为自动递增,但200多条记录的id分散在1到2000之间,但数据库的自动递增序列设置为从1开始。通常,序列中的下一个id未使用,但偶尔它已经被占用,数据库将返回此错误。
我使用答案here将序列重置为在最后一个种子记录之后开始,现在每次都有效。

qyzbxkaa

qyzbxkaa4#

当使用SQLite作为数据库时,Sequelize(当前为5.21.5)在 * 每个约束错误 * 上抛出SequelizeUniqueConstraintError,即使它与唯一索引无关。一个例子是将NULL插入到不可为空的列中。因此,在调试此异常时,请确保还检查其他类型的错误。

8i9zcol2

8i9zcol25#

基于@Ricardo马查多的答案,如果你将unique:true添加到一个模型中,并且在现有的表中已经有了在这个新约束下不允许的值,你会得到这个错误。要修复,您可以手动删除行或删除表,然后Sequelize再次构建它。

ie3xauqp

ie3xauqp6#

如果你偶然发现这个来自Sequelize的Validation error:检查填充(创建)表的查询是否执行一次。
我的Nest.js应用程序没有正确设置,并且执行了两次相同的命令,因此违反了唯一约束。

sauutmhj

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命令执行的数据库管理工具。

相关问题