Экспресс-валидатор: как проверить "дату начала" перед "датой окончания"

Я использую 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= имя поля ввода для даты рождения

Другие вопросы по тегам