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 TABLE
pbms(
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 не работает с кэшированными дочерними объектами
В этом уроке вы узнаете,как настроить валидации и ограничения для ваших моделей в 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)
), но модель — широкий подход к валидации чище.