Search code examples
expressmomentjsexpress-validator

Express Validatior - How Do I Break The Validation Chain?


I have a date field that I want to ensure is in a valid format and if so is the user over 18. The format is YYYY-MM-DD.

Here is one of my validators - the one that is failing:

body('birthday', 'Date format should be: YYYY-MM-DD')
  .isRFC3339()
  .custom(date => { 
    const over18 = moment().diff(date, 'years') >= 18;
    if(!over18) {
      return Promise.reject('You must be 18 or over!');
    }
  }),

Currently what happens is if the date is not a RFC3339 date the validation chain continues. This is problematic because moment produces an error if I pass an ill formatted date.

How do I break the chain after the call to .isRFC3339() so that if the date is invalid the custom validator will not run? I couldn't find anything in the docs


Solution

  • You can use momentjs strict mode together with String + Format parsing using moment.ISO_8601 (or moment.HTML5_FMT.DATE) special formats.

    Your code could be like the following:

    body('birthday', 'Date format should be: YYYY-MM-DD')
      // .isRFC3339() // no more needed
      .custom(date => {
        const mDate = moment(date, moment.ISO_8601, true);
        const over18 = moment().diff(mDate, 'years') >= 18;
        if(!mDate.isValid()) {
          return Promise.reject('Date is not YYYY-MM-DD');
        if(!over18) {
          return Promise.reject('You must be 18 or over!');
        }
      }),