Экспресс-валидатор: как проверить "дату начала" перед "датой окончания"
Я использую express-validator
чтобы сделать мой сервер проверки, и я столкнулся с небольшой проблемой с моей проверкой даты. Я пытаюсь подтвердить, что моя Дата начала предшествует моей дате окончания. Я в настоящее время использую это:
check('taskStartDate', { isBefore : ('taskEndDate' === undefined ) })
.isBefore('taskEndDate').withMessage('Start Date must be before End Date')
Однако проблема в том, что независимо от того, какую дату я ввожу в свою форму, независимо от того, является ли дата начала до или после даты окончания, я получаю свое реализованное сообщение "Дата начала должна быть раньше даты окончания". Я не знаю, как еще сделать это, кроме настраиваемого валидатора, который, если это рекомендуемый способ, был бы признателен за любые рекомендации о том, как написать настраиваемую валидацию. Я также попытался включить очистку следующим образом:
check('taskStartDate').isBefore(sanitizeBody('taskEndDate').toDate())
.withMessage( 'Start Date must be before End Date.')
но это тоже не сработало. Любая помощь будет принята с благодарностью!
4 ответа
Как написал @gustavohenke, вы должны создать собственный валидатор. Код ниже предназначен для экспресс-валидатора версии 13.7.0 . Основное отличие от примера @gustavohenke заключается в изменении функции проверки наcheck()
и в текущей версии эта функция должна возвращатьtrue
в конце.
[
check('end').toDate(),
check('start').toDate().custom((startDate, { req }) => {
if (startDate.getTime() > req.body.end.getTime()) {
throw new Error('start date must be before end date');
}
return true
})
];
Экспресс-валидатор использует базовый валидатор.js, поэтому все промежуточное ПО валидатора.js также доступно в экспресс-валидаторе.
проверьте [validator.js]: https://github.com/validatorjs/validator.js#validators для получения полного списка
есть .isAfter () и isBefore ().
вы можете реализовать этот способ
по умолчанию сейчас (текущая дата)
Да, использование пользовательского валидатора - это то, что нужно, когда вы хотите сравнить значение с другим в запросе.
Вас заинтересует следующая комбинация sanitizers и validator (sanitizers запускаются перед валидаторами, поэтому вы можете получить значение как Date
объекты при их использовании):
[
sanitize('taskEndDate').toDate(),
check('taskStartDate').toDate().custom((startDate, { req }) => {
if (startDate.getTime() >= req.body.taskEndDate.getTime()) {
throw new Error('start date must be before end date');
}
})
]
Посмотрите на документы для дальнейших примеров.
Вот пользовательский валидатор для проверки, действительна ли введенная дата рождения (dob), то есть до сегодняшней даты.
check('dob').custom(value=>{
let enteredDate=new Date(value);
let todaysDate=new Date();
if(enteredDate>todaysDate){
throw new Error("Invalid Date");
}
return true;
})
dob= имя поля ввода для даты рождения