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

时间:2016-11-20 21:08:30

标签: javascript mysql node.js sequelize.js

我收到此错误:

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

                } 
            });



    });

6 个答案:

答案 0 :(得分:11)

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

抓住Promise拒绝以查看错误/验证详细信息

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

答案 1 :(得分:6)

如果您创建了唯一约束,请检入您的数据库,我的猜测是您为unique: true添加了一些值并进行了更改,但是sequelize无法删除它来自您的数据库的约束。

答案 2 :(得分:3)

我的QA数据库存在此问题。有时新记录会保存到数据库中,有时会失败。在我的开发工作站上执行相同的过程时,它每次都会成功。

当我发现错误时(根据@doublesharp' s好建议)并将完整结果打印到控制台,它确认违反了一个唯一约束 - 特别是主键id列,它被设置为默认为自动增量值。

我用记录播种了我的数据库,即使这些记录的ID也设置为自动增量,200个记录的ID分散在1到2000之间,但数据库的自动增量序列是设置为从1开始。通常,序列中的下一个id未使用,但偶尔它已被占用,数据库将返回此错误。

我使用答案here重置序列,以便在我的最后一个种子记录之后开始,现在它每次都有效。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

在@Ricardo Machado的答案的基础上,如果将unique:true添加到模型中,并且在现有表中已经具有在此新约束下不允许使用的值,则会出现此错误。要解决此问题,您可以手动删除行或删除表,以便Sequelize再次构建它。

答案 5 :(得分:0)

如果您在 Sequelize 中偶然发现此 Validation error:检查填充(创建)表的查询是否执行一次。

我的 Nest.js 应用没有正确设置并执行了两次相同的命令,从而违反了唯一约束。