Sequelizeuniqueconstrainterror validation error

What you are doing? when i try insert a record into an empty table I get this message: SequelizeUniqueConstraintError: Validation error errors: [ { message: 'PRIMARY must be unique', type: ...

What you are doing?

when i try insert a record into an empty table I get this message:

SequelizeUniqueConstraintError: Validation error

errors:
[ { message: ‘PRIMARY must be unique’,
type: ‘unique violation’,
path: ‘PRIMARY’,
value: ‘2-50-100-431439-1’ } ],
fields: { PRIMARY: ‘2-50-100-431439-1’ },
parent:
{ Error: ER_DUP_ENTRY: Duplicate entry ‘2-50-100-431439-1’ for key ‘PRIMARY’

When I run the insert generated by sequelize, the record is successfully inserted.
INSERT INTO contrato.pbms (TPO_PBMS,CLS_PBMS,SCL_PBMS,SEQ_PBMS,CD_SIS_OGM,NOM_ITEM,IND_BASE,CD_TIP_ITEM) VALUES (2,50,100,431439,1,’MANUT/SUP SOLUC VIDEOWALL ‘,20,99);

Post a minimal code sample that reproduces the issue, including models and associations
Model :

var pbms = sequelize.define('pbms', {

        TPO_PBMS: {
            type: DataTypes.INTEGER,
            underscored: true,
            allowNull: false,
            primaryKey: true
        },
        CLS_PBMS: {
            type: DataTypes.INTEGER,
            underscored: true,
            allowNull: false,
            primaryKey: true
        },
        SCL_PBMS: {
            type: DataTypes.INTEGER,
            underscored: true,
            allowNull: false,
            primaryKey: true
        },
        SEQ_PBMS: {
            type: DataTypes.INTEGER,
            underscored: true,
            allowNull: false,
            primaryKey: true
        },
        CD_SIS_OGM: {
            type: DataTypes.INTEGER,
            underscored: true,
            allowNull: false,
            primaryKey: true
        },
        NOM_ITEM: {
            type: DataTypes.STRING(50),
            underscored: true,
            allowNull: true
        },
        IND_BASE: {
            type: DataTypes.INTEGER,
            allowNull: true,
            underscored: true
        },
        CD_TIP_ITEM: {
            type: DataTypes.INTEGER,
            underscored: true,
            allowNull: true
        }
    }, {
        schema   : 'contrato',
        tableName: 'pbms',
        freezeTableName: true,
        classMethods: {
        }
    });

Data

var data = {
            'TPO_PBMS' : 2,
            'CLS_PBMS' : 50,
            'SCL_PBMS' : 100,
            'SEQ_PBMS' : 431439,
            'CD_SIS_OGM' : 1,
            'NOM_ITEM' :        'MANUT/SUP SOLUC VIDEOWALL          ',
            'IND_BASE' : 20,
            'CD_TIP_ITEM' : 99
        };

Table
CREATE TABLEpbms( TPO_PBMSmediumint(6) NOT NULL, CLS_PBMSsmallint(6) NOT NULL, SCL_PBMSsmallint(6) NOT NULL, SEQ_PBMSint(11) NOT NULL, CD_SIS_OGMsmallint(6) NOT NULL, NOM_ITEMvarchar(50) DEFAULT NULL, IND_BASEsmallint(6) DEFAULT NULL, CD_TIP_ITEMsmallint(6) DEFAULT NULL, PRIMARY KEY (TPO_PBMS,CLS_PBMS,SCL_PBMS,SEQ_PBMS,CD_SIS_OGM) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

What do you expect to happen?

insert the record

What is actually happening?

error

Output, either JSON or SQL

Dialect: mysql
Database version: 5.6
Sequelize version: last version

Доброе утро.Скажите пожалуйста почему не срабатывает заданный параметр?Пример взял из документации,подставил свои поля.

const sequelize = new Sequelize('test', 'root', '', {
  host: 'localhost',
  dialect: 'mysql'
});

sequelize
  .authenticate()
  .then(() => {
    console.log('Connection has been established successfully.');
  })
  .catch(err => {
    console.error('Unable to connect to the database:', err);
  });

const User = sequelize.define('users', {
  // attributes
  id: {
    type: Sequelize.INTEGER,
    primaryKey: true,
    autoIncrement: true //Должен генерировать id
    // defaultValue: 123 - пределение id в ручную,но в документации этого не было,я это выгуглил
  },
  email: {
    type: Sequelize.STRING,
    allowNull: false
  },
  password: {
    type: Sequelize.STRING
    // allowNull defaults to true
  }
}, {
  // options
});

User.create({ email: "Jane", password: "Doe" }).then(jane => {
  console.log("Jane's auto-generated ID:", jane.id);
});


Unhandled rejection SequelizeUniqueConstraintError: Validation error
at Query.formatError (C:UsersHistoryDesktopsessionnode_modulessequelizelibdialectsmysqlquery.js:223:16)
at Execute.handler [as onResult] (C:UsersHistoryDesktopsessionnode_modulessequelizelibdialectsmysqlquery.js:51:23)
at Execute.execute (C:UsersHistoryDesktopsessionnode_modulesmysql2libcommandscommand.js:30:14)
at Connection.handlePacket (C:UsersHistoryDesktopsessionnode_modulesmysql2libconnection.js:408:32)
at PacketParser.Connection.packetParser.p [as onPacket] (C:UsersHistoryDesktopsessionnode_modulesmysql2libconnection.js:70:12)
at PacketParser.executeStart (C:UsersHistoryDesktopsessionnode_modulesmysql2libpacket_parser.js:75:16)
at Socket.Connection.stream.on.data (C:UsersHistoryDesktopsessionnode_modulesmysql2libconnection.js:77:25)
at Socket.emit (events.js:198:13)
at addChunk (_stream_readable.js:288:12)
at readableAddChunk (_stream_readable.js:269:11)
at Socket.Readable.push (_stream_readable.js:224:10)
at TCP.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)

I’m getting this error:

Unhandled rejection SequelizeUniqueConstraintError: Validation error

How can I fix this?

This is my 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;
};

And this is my 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');
                        });

                } 
            });



    });

Answer

The call to User.create() is returning a Promise.reject(), but there is no .catch(err) to handle it. Without catching the error and knowing the input values it’s hard to say what the validation error is – the request.body.email could be too long, etc.

Catch the Promise reject to see the error/validation details

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

Update, since it’s 2019 and you can use 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);
}

Attribution
Source : Link , Question Author : Filipe Ferminiano , Answer Author : doublesharp

Я получаю эту ошибку:

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

И это мои маршруты.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');
                        });

                } 
            });



    });

20 нояб. 2016, в 22:55

Поделиться

Источник

3 ответа

Вызов User.create() возвращает Promise.reject(), но для его обработки нет .catch(err). Не поймав ошибку и зная входные значения, трудно сказать, что такое ошибка проверки — request.body.email может быть слишком длинным и т.д.

Поймать обещание отклонить, чтобы просмотреть сведения об ошибке/валидации

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

doublesharp
22 нояб. 2016, в 22:15

Поделиться

Проверьте свою базу данных, если у вас есть уникальное ограничение, я предполагаю, что вы добавили некоторое значение в значение unique: true и изменили его, но sequelize не смог удалить его из базы данных.

Ricardo Machado
23 нояб. 2016, в 16:52

Поделиться

У меня была проблема с моей базой данных QA. Иногда новая запись сохраняется в базе данных, и иногда она терпит неудачу. При выполнении одного и того же процесса на моей рабочей станции dev это будет успешным каждый раз.

Когда я поймал ошибку (за @doublesharp хороший совет) и распечатал полные результаты на консоли, он подтвердил, что уникальное ограничение как нарушено — в частности, столбец идентификатора первичного ключа, который был установлен по умолчанию на автоинкрементное значение.

Я засеял свою базу данных записями, и хотя идентификаторы этих записей также были настроены на автоинкремент, идентификаторы 200-некоторых записей были разбросаны между 1 и 2000 годами, но последовательность автоинкремента базы данных была установлена в 1. Обычно следующий id в последовательности был не использован, но иногда он уже занят, и база данных вернет эту ошибку.

Я использовал здесь ответ, чтобы восстановить последовательность, которая начнется после последней из моих засеваемых записей, и теперь она работает каждый раз.

aherocalledFrog
03 июнь 2018, в 22:50

Поделиться

Ещё вопросы

  • 0Поиск комбинации возврата каретки / перевода строки с помощью c ++
  • 0Проблема с отчетливым mysql
  • 0Как создать новый экземпляр в Angularjs? Метод сохранения CRUD не работает
  • 0MySql: индексный цикл
  • 0Ошибка зависимостей однорангового NPM
  • 0Как перебрать все ключи кроме одного в руле?
  • 0Базовый класс не имеет конструктора по умолчанию, когда списки инициализации конструктора производного класса
  • 0Grunt минификация не удалась для AuthService
  • 1Разделить файл на тестовый файл и обучающий файл с помощью Weka
  • 0Как получить смелый вариант пользовательского шрифта?
  • 0Drupal игнорирует разрешение сервера и отображает ошибку разрешения
  • 1Как заставить проект Android и стандартный проект Java играть хорошо?
  • 1Почему метод OnStart () из ServiceBase имеет параметр arguments?
  • 0jQuery .wrapAll () выпуск
  • 0цикл через массив с оператором Switch
  • 1Как контролировать размер изображения при загрузке с URL с помощью C #
  • 1Является ли java.nio.file.PathMatcher потоком безопасно?
  • 0PHP: заменить пробелы в конце строки перед вопросом mark_?
  • 1Проверка подлинности Windows в MVC 5
  • 0ВЫБЕРИТЕ пользователей с несколькими условиями И / ИЛИ / В в 1 столбце
  • 0ASP.NET MVC4 руководство ajax пост без проверки
  • 0ng-show не работает angular.js
  • 1Доступ запрещен при удалении файла
  • 0C ++ скомпилирован в сценарии cgi с curl не работает
  • 0Мой контроллер мешает моей UI-маршрутизации
  • 0Попытка выяснить, есть ли лучший способ структурировать этот запрос с помощью объединений
  • 1Как изменить свойство переднего плана AvalonDock AnchorablePaneTitle ContentPresenter при автоматическом скрытии?
  • 0Как обнаружить взаимодействие с пользователем в директиве
  • 1Как отключить захват событий окна в Emscripten + SDL?
  • 0сообщение пытается получить свойство необъекта в codeigniter
  • 1Как добавить массив JSON в бесконечное количество меню параметров?
  • 0jQuery вызов webAPI WebSecurity.IsAuthenticated всегда ложно
  • 0Как стилизовать подменю CSS?
  • 1В Java, когда один из методов в объекте «синхронизирован», все ли методы «синхронизированы»?
  • 1Где хранятся потоковые данные BLOB до фиксации?
  • 1Ошибка при сворачивании форм с диаграммами в системный трей,
  • 1C # Изменение веб-ссылки URL
  • 0Задержка анимации ползунка и изменение эффекта на исчезновение?
  • 0php foreach не работает должным образом на объекте json [duplicate]
  • 1Несколько простых графиков на одной странице d3.js
  • 1Как удвоить буфер прямоугольников
  • 1Почему я должен использовать startActivity в Сервисе?
  • 0извлекать невыпуклую оболочку из результата суммы Минковского с помощью наддува
  • 1Как установить компоненты платформы Android в автономном режиме?
  • 0Spring Boot — Hibernate не сохраняет дату правильно
  • 1Цикл Java не может обнаружить изменение по потоку
  • 0как выбрать имя столбца вместе с примененной к нему агрегатной функцией
  • 0Пользовательский ввод в течение цикла в PHP
  • 0Когда я получу «0.0.0.xx» или «0xxxx» с сервера, исходный код HTML закончится до начала последовательности
  • 0Метод JQuery не работает с кэшированными дочерними объектами

Сообщество Overcoder

В этом уроке вы узнаете,как настроить валидации и ограничения для ваших моделей в Sequelize.

В этом учебнике предполагается следующая настройка:

const { Sequelize, Op, Model, DataTypes } = require("sequelize");
const sequelize = new Sequelize("sqlite::memory:");

const User = sequelize.define("user", {
  username: {
    type: DataTypes.TEXT,
    allowNull: false,
    unique: true
  },
  hashedPassword: {
    type: DataTypes.STRING(64),
    is: /^[0-9a-f]{64}$/i
  }
});

(async () => {
  await sequelize.sync({ force: true });
  // Код здесь
})();

Разница между проверками и ограничениями

Валидации-это проверки,выполняемые на уровне Sequelize,на чистом JavaScript.Они могут быть произвольно сложными,если вы предоставите пользовательскую функцию валидатора,или могут быть одним из встроенных валидаторов,предлагаемых Sequelize.Если проверка не прошла,SQL-запрос вообще не будет отправлен в базу данных.

С другой стороны, ограничения — это правила, определенные на уровне SQL. Самый простой пример ограничения — уникальное ограничение. Если проверка ограничения завершится неудачно, база данных выдаст ошибку, и Sequelize перенаправит эту ошибку в JavaScript (в этом примере выбрасывает SequelizeUniqueConstraintError ). Обратите внимание, что в этом случае запрос SQL был выполнен, в отличие от случая проверки.

Unique Constraint

В нашем примере кода выше определяется уникальное ограничение для поля username :

/* ... */ {
  username: {
    type: DataTypes.TEXT,
    allowNull: false,
    unique: true
  },
} /* ... */

Когда эта модель синхронизируется (например, путем вызова sequelize.sync ), поле username будет создано в таблице как `name` TEXT UNIQUE , и попытка вставить имя пользователя, которое уже существует, вызовет SequelizeUniqueConstraintError .

Разрешение/запрещение нулевых значений

По умолчанию null является допустимым значением для каждого столбца модели. Это можно отключить, установив параметр allowNull: false для столбца, как это было сделано в поле username нашем примере кода:

/* ... */ {
  username: {
    type: DataTypes.TEXT,
    allowNull: false,
    unique: true
  },
} /* ... */

Без allowNull: false вызов User.create({}) будет работать.

Замечание о реализации allowNull

allowNull проверка только проверить в Sequelize , который представляет собой смесь из проверки , и ограничение в органах чувств , описанных в начале данного руководства. Это потому что:

  • Если предпринята попытка установить значение null для поля, которое не допускает null, будет ValidationError без выполнения какого-либо SQL-запроса .
  • Кроме того, после sequelize.sync столбец с allowNull: false будет определен с ограничением NOT NULL SQL. Таким образом, прямые SQL-запросы, которые пытаются установить значение null , также завершатся ошибкой.

Validators

Валидаторы модели позволяют указать проверки формата / содержимого / наследования для каждого атрибута модели. Проверки автоматически запускаются при create , update и save . Вы также можете вызвать validate() чтобы вручную проверить экземпляр.

валидации по атрибутам

Вы можете определить свои собственные валидаторы или использовать несколько встроенных валидаторов, реализованных с помощью validator.js (10.11.0) , как показано ниже.

sequelize.define('foo', {
  bar: {
    type: DataTypes.STRING,
    validate: {
      is: /^[a-z]+$/i,          // соответствует этому RegExp
      is: ["^[a-z]+$",'i'],     // то же, что и выше, но построение RegExp из строки
      not: /^[a-z]+$/i,         // не соответствует этому RegExp
      not: ["^[a-z]+$",'i'],    // то же, что и выше, но построение RegExp из строки
      isEmail: true,            // проверяет формат электронной почты (foo@bar.com)
      isUrl: true,              // проверяет формат URL (http://foo.com)
      isIP: true,               // проверяет формат IPv4 (129.89.23.1) или IPv6
      isIPv4: true,             // проверяет наличие IPv4 (129.89.23.1)
      isIPv6: true,             // проверяет формат IPv6
      isAlpha: true,            // разрешим только буквы
      isAlphanumeric: true,     // будут разрешены только буквенно-цифровые символы, поэтому "_abc" не сработает
      isNumeric: true,          // разрешим только числа
      isInt: true,              // проверяет правильность целых чисел
      isFloat: true,            // проверяет правильность чисел с плавающей запятой
      isDecimal: true,          // проверяет любые числа
      isLowercase: true,        // проверяет строчные буквы
      isUppercase: true,        // проверяет на заглавные буквы
      notNull: true,            // не допустит null
      isNull: true,             // допускает только null
      notEmpty: true,           // не разрешаем пустые строки
      equals: 'specific value', // разрешить только определенное значение
      contains: 'foo',          // форсировать определенные подстроки
      notIn: [['foo', 'bar']],  // проверяем, что значение не одно из этих
      isIn: [['foo', 'bar']],   // проверяем, является ли значение одним из этих
      notContains: 'bar',       // не разрешаем определенные подстроки
      len: [2,10],              // разрешены только значения длиной от 2 до 10
      isUUID: 4,                // разрешить только uuids
      isDate: true,             // разрешить только строки даты
      isAfter: "2011-11-05",    // разрешить строки даты только после определенной даты
      isBefore: "2011-11-05",   // разрешить строки даты только до определенной даты
      max: 23,                  // разрешены только значения <= 23
      min: 23,                  // разрешаем только значения> = 23
      isCreditCard: true,       // проверяем действующие номера кредитных карт

      // Примеры пользовательских валидаторов:
      isEven(value) {
        if (parseInt(value) % 2 !== 0) {
          throw new Error('Only even values are allowed!');
        }
      }
      isGreaterThanOtherField(value) {
        if (parseInt(value) <= parseInt(this.otherField)) {
          throw new Error('Bar must be greater than otherField.');
        }
      }
    }
  }
});

Обратите внимание, что если во встроенные функции проверки необходимо передать несколько аргументов, передаваемые аргументы должны быть в массиве. Но если должен быть передан единственный аргумент массива, например массив допустимых строк для isIn , это будет интерпретироваться как несколько строковых аргументов вместо одного аргумента массива. Чтобы обойти это, передайте массив аргументов одинарной длины, например [['foo', 'bar']] как показано выше.

Чтобы использовать настраиваемое сообщение об ошибке вместо сообщения, предоставляемого validator.js , используйте объект вместо простого значения или массива аргументов, например, валидатору, которому не нужен аргумент, можно передать настраиваемое сообщение с

isInt: {
  msg: "Must be an integer number of pennies"
}

или, если необходимо передать args добавьте свойство args :

isIn: {
  args: [['en', 'zh']],
  msg: "Must be English or Chinese"
}

При использовании пользовательских функций валидатора сообщение об ошибке будет тем же сообщением, которое содержит брошенный объект Error .

См. Проект validator.js для получения более подробной информации о встроенных методах проверки.

Подсказка: вы также можете определить пользовательскую функцию для части регистрации. Просто передайте функцию. Первым параметром будет строка, которая регистрируется.

allowNull взаимодействие с другими валидаторами

Если для определенного поля модели задано значение, allowNull: false значение null (с allowNull: false ), и для этого значения установлено значение null , все валидаторы будут пропущены, и будет выдано ValidationError .

С другой стороны, если он настроен на разрешение null (с allowNull: true ) и для этого значения установлено значение null , будут пропущены только встроенные валидаторы, а пользовательские валидаторы все равно будут работать.

Это означает, что вы можете, например, иметь строковое поле, которое проверяет, что его длина составляет от 5 до 10 символов, но также допускает значение null (поскольку валидатор длины будет автоматически пропущен, если значение равно null ):

class User extends Model {}
User.init({
  username: {
    type: DataTypes.STRING,
    allowNull: true,
    validate: {
      len: [5, 10]
    }
  }
}, { sequelize });

Вы также можете условно разрешить null значения с помощью специального валидатора, так как он не будет пропущен:

class User extends Model {}
User.init({
  age: Sequelize.INTEGER,
  name: {
    type: DataTypes.STRING,
    allowNull: true,
    validate: {
      customValidator(value) {
        if (value === null && this.age !== 10) {
          throw new Error("name can't be null unless age is 10");
        }
      })
    }
  }
}, { sequelize });

Вы можете настроить сообщение об ошибке allowNull , установив валидатор notNull :

class User extends Model {}
User.init({
  name: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: {
      notNull: {
        msg: 'Please enter your name'
      }
    }
  }
}, { sequelize });

Валидации по всей модели

Также можно определить валидации для проверки модели после валидаторов для конкретных полей. С помощью этого вы могли бы, например, не обеспечивает ни ни один из latitude и longitude установлены или оба, и потерпеть неудачу , если один , а не другой набор.

Методы валидатора модели вызываются с контекстом объекта модели и считаются неудачными,если они бросают ошибку,в противном случае передаются.Это то же самое,что и с пользовательскими полевыми валидаторами.

Все собранные сообщения об ошибках помещаются в объект результата проверки вместе с ошибками проверки поля, с ключами, названными в честь ключа неудачного метода validate объекте параметра проверки . Несмотря на то, что может быть только одно сообщение об ошибке для каждого метода проверки модели в любой момент времени, оно представляется как ошибка одной строки в массиве, чтобы максимизировать согласованность с ошибками поля.

Пример:

class Place extends Model {}
Place.init({
  name: Sequelize.STRING,
  address: Sequelize.STRING,
  latitude: {
    type: DataTypes.INTEGER,
    validate: {
      min: -90,
      max: 90
    }
  },
  longitude: {
    type: DataTypes.INTEGER,
    validate: {
      min: -180,
      max: 180
    }
  },
}, {
  sequelize,
  validate: {
    bothCoordsOrNone() {
      if ((this.latitude === null) !== (this.longitude === null)) {
        throw new Error('Either both latitude and longitude, or neither!');
      }
    }
  }
})

В этом простом случае объект не проходит проверку, если заданы широта или долгота, но не оба сразу. Если мы попытаемся построить один с широтой вне диапазона и без долготы, somePlace.validate() может вернуть:

{
  'latitude': ['Invalid number: latitude'],
  'bothCoordsOrNone': ['Either both latitude and longitude, or neither!']
}

Такая проверка также могла быть выполнена с помощью специального валидатора, определенного для одного атрибута (например, атрибута latitude , путем проверки (value === null) !== (this.longitude === null) ), но модель — широкий подход к валидации чище.

Понравилась статья? Поделить с друзьями:
  • Sequelize validation error
  • Sentry мониторинг ошибок
  • Sentry mode has turned off due to a sentry system error
  • Sentry is attempting to send 2 pending error messages
  • Sentinel runtime environment installer error