私はこのエラーを受け取っています:
Unhandled rejection SequelizeUniqueConstraintError: Validation error
どうすれば修正できますか?
これは私のモデル/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');
});
}
});
});
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 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);
}
nique Constraintが作成されている場合は、データベースをチェックインしてください。unique: true
と変更しましたが、sequelizeはデータベースの制約を削除できませんでした。
QAデータベースでこの問題が発生しました。新しいレコードがデータベースに保存されることもあれば、失敗することもあります。開発ワークステーションで同じプロセスを実行すると、毎回成功します。
エラーを(@doublesharpの適切なアドバイスに従って)キャッチし、すべての結果をコンソールに出力すると、一意制約に違反していることが確認されました。具体的には、デフォルトで自動インクリメント値に設定された主キーID列です。
データベースにレコードをシードしました。これらのレコードのIDも自動インクリメントに設定されていましたが、200のレコードのIDは1〜2000の間に散らばっていましたが、データベースの自動インクリメントシーケンスは1から始まるように設定されていましたシーケンス内の次のIDは使用されませんでしたが、場合によっては既に使用されていて、データベースはこのエラーを返します。
答え here を使用して、シードされたレコードの最後の後に開始するようにシーケンスをリセットしましたが、今では毎回動作します。
@Ricardo Machadoの答えに基づいて、unique:true
をモデルに追加し、既存のテーブルにこの新しい制約では許可されない値が既にある場合、このエラーが発生します。修正するには、行を手動で削除するか、テーブルを削除してから、Sequelizeがそれを再度ビルドします。