web-dev-qa-db-fra.com

Rejet non géré SequelizeUniqueConstraintError: erreur de validation

Je reçois cette erreur:

Unhandled rejection SequelizeUniqueConstraintError: Validation error

Comment puis-je réparer cela?

Ceci est mes modèles/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;
};

Et voici mes 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
Filipe Ferminiano

L'appel à User.create() renvoie un Promise.reject(), mais il n'y a pas de .catch(err) pour le gérer. Sans attraper l'erreur et connaître les valeurs d'entrée, il est difficile de dire quelle est l'erreur de validation - le request.body.email pourrait être trop long, etc.

Attrapez le rejet de la promesse pour voir les détails de l'erreur/validation

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

Mise à jour, car nous sommes en 2019 et vous pouvez utiliser async/wait

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

Vérifiez dans votre base de données si vous avez créé une Contrainte unique, je suppose que vous mettez de la valeur à unique: true et l'a changé, mais sequelize n'a pas pu supprimer sa contrainte de votre base de données.

6
Ricardo Machado

J'ai eu ce problème avec ma base de données QA. Parfois, un nouvel enregistrement était sauvegardé dans la base de données, et parfois il échouait. Lors de l'exécution du même processus sur mon poste de travail de développement, il réussirait à chaque fois.

Lorsque j'ai détecté l'erreur (selon les bons conseils de @ doublesharp) et imprimé les résultats complets sur la console, cela a confirmé qu'une contrainte unique était violée - en particulier, la colonne id de la clé primaire, qui était définie par défaut sur une valeur auto-incrémentée.

J'avais semé ma base de données avec des enregistrements, et même si les identifiants de ces enregistrements étaient également définis sur auto-incrémentation, les identifiants des quelque 200 enregistrements étaient dispersés entre 1 et 2000, mais la séquence d'auto-incrémentation de la base de données devait commencer à 1. Généralement l'id suivant dans la séquence n'était pas utilisé, mais il était parfois déjà occupé et la base de données renverrait cette erreur.

J'ai utilisé la réponse ici pour réinitialiser la séquence pour commencer après le dernier de mes enregistrements prédéfinis, et maintenant cela fonctionne à chaque fois.

4
aherocalledFrog

En s'appuyant sur la réponse de @Ricardo Machado, si vous ajoutez unique:true à un modèle et ont déjà des valeurs dans une table existante qui ne seraient pas autorisées sous cette nouvelle contrainte, vous obtiendrez cette erreur. Pour résoudre ce problème, vous pouvez supprimer manuellement les lignes ou supprimer le tableau et ainsi Sequelize le reconstruit.

1
ow3n