web-dev-qa-db-ja.com

未処理の拒否SequelizeUniqueConstraintError:検証エラー

私はこのエラーを受け取っています:

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

                } 
            });



    });
9

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);
}
16
doublesharp

nique Constraintが作成されている場合は、データベースをチェックインしてください。unique: trueと変更しましたが、sequelizeはデータベースの制約を削除できませんでした。

6
Ricardo Machado

QAデータベースでこの問題が発生しました。新しいレコードがデータベースに保存されることもあれば、失敗することもあります。開発ワークステーションで同じプロセスを実行すると、毎回成功します。

エラーを(@doublesharpの適切なアドバイスに従って)キャッチし、すべての結果をコンソールに出力すると、一意制約に違反していることが確認されました。具体的には、デフォルトで自動インクリメント値に設定された主キーID列です。

データベースにレコードをシードしました。これらのレコードのIDも自動インクリメントに設定されていましたが、200のレコードのIDは1〜2000の間に散らばっていましたが、データベースの自動インクリメントシーケンスは1から始まるように設定されていましたシーケンス内の次のIDは使用されませんでしたが、場合によっては既に使用されていて、データベースはこのエラーを返します。

答え here を使用して、シードされたレコードの最後の後に開始するようにシーケンスをリセットしましたが、今では毎回動作します。

4
aherocalledFrog

@Ricardo Machadoの答えに基づいて、unique:trueをモデルに追加し、既存のテーブルにこの新しい制約では許可されない値が既にある場合、このエラーが発生します。修正するには、行を手動で削除するか、テーブルを削除してから、Sequelizeがそれを再度ビルドします。

1
ow3n