валидаторjs
Библиотека validatorjs упрощает проверку данных в JavaScript как в браузере, так и в Node.js. Эта библиотека была вдохновлена Validator из платформы Laravel .
Зачем использовать валидаторы?
- Не зависит от каких-либо библиотек.
- Работает как в браузере, так и в Node.
- Читабельные и декларативные правила проверки.
- Сообщения об ошибках с многоязычной поддержкой.
- Поддержка AMD/Require.js и CommonJS/Browserify.
Монтаж
Загрузите validatorjs из Bower, NPM или из каталога /dist на Github:
1bower install validatorjs
1npm install validatorjs
Browser
1<script src="validator.js"></script>
Node.js / Browserify
1let Validator = require('validatorjs');
Basic Usage
1let validation = new Validator(data, rules [, customErrorMessages]);
data {Object} — данные, которые вы хотите проверить.
правила {Объект} — правила проверки
customErrorMessages {Object} – необязательные возвращаемые пользовательские сообщения об ошибках.
Пример 1. Прохождение проверки
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16let data = {
name: 'John',
email: 'johndoe@gmail.com',
age: 28
};
let rules = {
name: 'required',
email: 'required|email',
age: 'min:18'
};
let validation = new Validator(data, rules);
validation.passes(); // true
validation.fails(); // false
Чтобы применить правила проверки к объекту данных , используйте те же имена ключей объекта, что и для объекта правил .
Пример 2. Неудачная проверка
1
2
3
4
5
6
7
8
9
10
11
12
13
14let validation = new Validator({
name: 'D',
email: 'not an email address.com'
}, {
name: 'size:3',
email: 'required|email'
});
validation.fails(); // true
validation.passes(); // false
// Error messages
validation.errors.first('email'); // 'The email format is invalid.'
validation.errors.get('email'); // returns an array of all email error messages
Nested Rules
Вложенные объекты также можно проверять. Существует два способа объявления правил проверки для вложенных объектов. Первый способ — объявить правила проверки с соответствующей структурой вложенных объектов, отражающей данные. Второй способ — объявить правила проверки с помощью плоского ключа. имена. Например, для проверки следующих данных:
1
2
3
4
5
6
7
8
9
10let data = {
name: 'John',
bio: {
age: 28,
education: {
primary: 'Elementary School',
secondary: 'Secondary School'
}
}
};
Мы могли бы объявить наши правила проверки следующим образом:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19let nested = {
name: 'required',
bio: {
age: 'min:18',
education: {
primary: 'string',
secondary: 'string'
}
}
};
// OR
let flattened = {
'name': 'required',
'bio.age': 'min:18'
'bio.education.primary': 'string',
'bio.education.secondary': 'string'
};
WildCards Rules
WildCards также могут быть проверены.
1
2
3
4
5
6
7
8
9
10
11
12let data = {
users: [{
name: 'John',
bio: {
age: 28,
education: {
primary: 'Elementary School',
secondary: 'Secondary School'
}
}
}]
};
Мы могли бы объявить наши правила проверки следующим образом:
1
2
3
4
5
6let rules = {
'users.*.name': 'required',
'users.*.bio.age': 'min:18'
'users.*.bio.education.primary': 'string',
'users.*.bio.education.secondary': 'string'
};
Available Rules
В правилах проверки нет неявного «обязательного». Если поле не определено или представляет собой пустую строку, оно пройдет проверку. Если вы хотите, чтобы проверка не удалась для неопределенного или «», используйте обязательное правило.
принял
Проверяемое поле должно иметь значение «да», «включено», «1» или «истина». Это полезно для подтверждения принятия «Условий обслуживания».
после: дата
Проверяемое поле должно быть позже указанной даты.
after_or_equal:дата
Поле, подлежащее проверке, должно быть после или равно заданному полю.
альфа
Проверяемое поле должно состоять полностью из буквенных символов.
альфа_даш
Проверяемое поле может содержать буквенно-цифровые символы, а также тире и подчеркивания.
альфа_номер
Проверяемое поле должно состоять полностью из буквенно-цифровых символов.
множество
Проверяемое поле должно быть массивом.
до:дата
Проверяемое поле должно быть до указанной даты.
before_or_equal:дата
Проверяемое поле должно быть раньше или равно указанной дате.
между: мин, макс
Размер проверяемого поля должен находиться между заданными минимальным и максимальным значениями. Строки, числа и файлы оцениваются так же, как и правило размера.
логическое значение
Проверяемое поле должно быть логическим значением вида true
, false
, 0
, 1
, 'true'
, 'false'
, '0'
, '1'
,
подтвержденный
Поле, находящееся на проверке, должно иметь соответствующее поле foo_confirmation. Например, если поле, находящееся на проверке, является паролем, во входных данных должно присутствовать соответствующее поле pass_confirmation.
дата
Проверяемое поле должно иметь действительный формат даты, приемлемый для Date
объекта Javascript.
цифры: значение
Проверяемое поле должно быть числовым и иметь точную длину значения.
другое: атрибут
Данное поле должно отличаться от проверяемого поля.
электронная почта
Проверяемое поле должно быть отформатировано как адрес электронной почты.
шестигранник
Проверяемое поле должно иметь шестнадцатеричный формат. Полезно в сочетании с другими правилами, например hex|size:6
для проверки шестнадцатеричного цветового кода.
в:фу,бар,...
Проверяемое поле должно быть включено в заданный список значений. Поле может быть массивом или строкой.
целое число
Проверяемое поле должно иметь целочисленное значение.
Макс: значение
Убедитесь, что атрибут не превышает заданный размер.
Примечание. Максимальное количество проверок включено.
мин:значение
Убедитесь, что атрибут имеет хотя бы заданный размер.
Примечание. Минимальные проверки включены в стоимость.
not_in:foo,бар,...
Проверяемое поле не должно быть включено в данный список значений.
числовой
Убедитесь, что атрибут является числовым. Строковое представление числа будет пройдено.
необходимый
Проверяет, равна ли длина строкового представления значения >
требуется_если: другое поле, значение
Проверяемое поле должно присутствовать и не быть пустым, если полеotherfield равно любому значению.
require_unless: другое поле, значение
Проверяемое поле должно присутствовать и не быть пустым, если только полеotherfield не равно какому-либо значению.
require_with:foo,bar,...
Проверяемое поле должно присутствовать и не быть пустым только в том случае, если присутствует любое из других указанных полей.
require_with_all:foo,bar,...
Проверяемое поле должно присутствовать и не быть пустым только в том случае, если присутствуют все остальные указанные поля.
требуется_без:foo,bar,...
Проверяемое поле должно присутствовать и не быть пустым только в том случае, если какое-либо из других указанных полей отсутствует.
require_without_all:foo,bar,...
Проверяемое поле должно присутствовать и не быть пустым только в том случае, если все остальные указанные поля отсутствуют.
то же самое: атрибут
Данное поле должно соответствовать проверяемому полю.
размер:значение
Проверяемое поле должно иметь размер, соответствующий заданному значению. Для строковых данных значение соответствует количеству символов. Для числовых данных значение соответствует заданному целочисленному значению.
нить
Проверяемое поле должно быть строкой.
URL
Убедитесь, что атрибут имеет действительный формат URL.
регулярное выражение:шаблон
Проверяемое поле должно соответствовать данному регулярному выражению.
Примечание . При использовании regex
шаблона может потребоваться указать правила в массиве вместо использования разделителей вертикальной черты, особенно если регулярное выражение содержит символ вертикальной черты. Для каждой обратной косой черты, которую вы использовали в шаблоне регулярного выражения, вы должны экранировать каждую из них. с еще одной обратной косой чертой.
Пример 3. Проверка регулярных выражений
1
2
3
4
5
6
7
8
9
10
11
12let validation = new Validator({
name: 'Doe',
salary: '10,000.00',
yearOfBirth: '1980'
}, {
name: 'required|size:3',
salary: ['required', 'regex:/^(?!0\\.00)\\d{1,3}(,\\d{3})*(\\.\\d\\d)?$/'],
yearOfBirth: ['required', 'regex:/^(19|20)[\\d]{2,2}$/']
});
validation.fails(); // false
validation.passes(); // true
Пример 4. Проверка типа
1
2
3
4
5
6
7
8
9
10let validation = new Validator({
age: 30,
name: ''
}, {
age: ['required', { 'in': [29, 30] }],
name: [{ required_if: ['age', 30] }]
});
validation.fails(); // true
validation.passes(); // false
Register Custom Validation Rules
1Validator.register(name, callbackFn, errorMessage);
name {String} — Имя правила.
callbackFn {Function} — возвращает логическое значение, обозначающее успешную или неудачную проверку.
errorMessage {String} — необязательная строка, в которой можно указать собственное сообщение об ошибке. :attribute внутри errorMessage будет заменен именем атрибута.
1
2
3Validator.register('telephone', function(value, requirement, attribute) { // requirement parameter defaults to null
return value.match(/^\d{3}-\d{3}-\d{4}$/);
}, 'The :attribute phone number is not in the format XXX-XXX-XXXX.');
Asynchronous Validation
Зарегистрируйте асинхронное правило, которое принимает passes
обратный вызов:
1
2
3
4
5
6Validator.registerAsync('username_available', function(username, attribute, req, passes) {
// do your database/api checks here etc
// then call the `passes` method where appropriate:
passes(); // if username is available
passes(false, 'Username has already been taken.'); // if username is not available
});
Затем позвоните своему валидатору, передав обратный вызов fails
или passes
что-то вроде этого:
1
2
3
4
5
6
7
8
9
10
11
12
13let validator = new Validator({
username: 'test123'
}, {
username: 'required|min:3|username_available'
});
validator.passes(function() {
// Validation passed
});
validator.fails(function() {
validator.errors.first('username');
});
Примечание. Если вы попытаетесь вызвать обратный вызов passes
или fails
без него, и валидатор обнаружит наличие правил асинхронной проверки, будет выдано исключение.
Error Messages
Этот конструктор автоматически генерирует сообщения об ошибках для правил проверки, которые не удалось выполнить.
Если есть ошибки, объект свойства ошибок экземпляра Validator будет заполнен сообщениями об ошибках для всех неверных атрибутов. Методы и свойства объекта свойств ошибок :
.first(атрибут)
возвращает первое сообщение об ошибке для атрибута, в противном случае — false
.get(атрибут)
возвращает массив сообщений об ошибках для атрибута или пустой массив, если ошибок нет
.все()
возвращает объект, содержащий все сообщения об ошибках для всех неверных атрибутов
.has(атрибут)
возвращает true, если для атрибута существуют сообщения об ошибках, в противном случае — false
.errorCount
количество ошибок валидации
1
2
3let validation = new Validator(input, rules);
validation.errors.first('email'); // returns first error message for email attribute
validator.errors.get('email'); // returns an array of error messages for the email attribute
Custom Error Messages
Если вам нужно конкретное сообщение об ошибке и вы не хотите переопределять сообщение по умолчанию, вы можете передать переопределение в качестве третьего аргумента объекту Validator, как и в случае с Laravel .
1
2
3
4
5
6
7
8
9
10let input = {
name: ''
};
let rules = {
name : 'required'
};
let validation = new Validator(input, rules, { required: 'You forgot to give a :attribute' });
validation.errors.first('name'); // returns 'You forgot to give a name'
Некоторые валидаторы имеют строковые и числовые версии, их тоже можно изменить.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15let input = {
username: 'myusernameistoolong'
};
let rules = {
username : 'max:16'
};
let validation = new Validator(input, rules, {
max: {
string: 'The :attribute is too long. Max length is :max.'
}
});
validation.errors.first('username'); // returns 'The username is too long. Max length is 16.'
Вы даже можете предоставлять сообщения об ошибках для каждого атрибута! Просто установите для ключа сообщения значение «validator.attribute».
1
2
3
4
5
6
7
8
9let input = { name: '', email: '' };
let rules = { name : 'required', email : 'required' };
let validation = new Validator(input, rules, {
"required.email": "Without an :attribute we can't reach you!"
});
validation.errors.first('name'); // returns 'The name field is required.'
validation.errors.first('email'); // returns 'Without an email we can\'t reach you!'
Custom Attribute Names
Чтобы отобразить имя пользовательского «дружественного» атрибута в сообщениях об ошибках, используйте.setAttributeNames()
1
2
3
4
5let validator = new Validator({ name: '' }, { name: 'required' });
validator.setAttributeNames({ name: 'custom_name' });
if (validator.fails()) {
validator.errors.first('name'); // "The custom_name field is required."
}
В качестве альтернативы вы можете указать глобальные имена пользовательских атрибутов на вашем языке вместе со attributes
свойством.
Вы также можете настроить собственный форматировщик атрибутов:
1
2
3
4
5
6
7
8
9
10
11
12
13// Configure global formatter.
Validator.setAttributeFormatter(function(attribute) {
return attribute.replace(/_/g, ' ');
});
// Or configure formatter for particular instance.
let validator = new Validator({ first_name: '' }, { first_name: 'required' });
validator.setAttributeFormatter(function(attribute) {
return attribute.replace(/_/g, ' ');
});
if (validator.fails()) {
console.log(validator.errors.first('first_name')); // The first name field is required.
}
Примечание. По умолчанию все символы _ заменяются пробелами.
Language Support
По умолчанию сообщения об ошибках выводятся на английском языке. Чтобы включить в браузере другой язык, укажите языковой файл в теге скрипта и вызовите Validator.useLang('lang_code')
.
1
2
3
4
5<script src="dist/validator.js"></script>
<script src="dist/lang/ru.js"></script>
<script>
Validator.useLang('es');
</script>
В Node он автоматически выбирает исходные языковые файлы.
1
2let Validator = require('validatorjs');
Validator.useLang('ru');
Если вы не видите поддержку своего языка, добавьте ее в src/lang
!
Вы также можете добавить свой собственный язык, вызвав setMessages
:
1
2
3Validator.setMessages('lang_code', {
required: 'The :attribute field is required.'
});
Получите необработанный объект сообщений для данного языка:
1Validator.getMessages('lang_code');
Переключите язык по умолчанию, используемый валидатором:
1Validator.useLang('lang_code');
Получите используемый язык по умолчанию:
1Validator.getDefaultLang(); // returns e.g. 'en'
Переопределить сообщения по умолчанию для языка:
1
2
3let messages = Validator.getMessages('en');
messages.required = 'Whoops, :attribute field is required.';
Validator.setMessages('en', messages);