Whisher
Whisher

Reputation: 32716

hapi route joi validation of password confirmation

How do I check that password and password_confirmation are the same ?

var Joi = require('joi'),
S = Joi.string().required().min(3).max(15);
exports.create = {
   payload: {
            username: S,
            email: Joi.string().email(),
            password: S,
            password_confirmation:  S
   }
}

Upvotes: 17

Views: 25445

Answers (2)

ThangLe
ThangLe

Reputation: 970

If you got "language" is not allowed error message. Oh, you've come to the right place.

Now, 2020 and with Joi v17.2.1 we can use Joi.any().equal() or Joi.any().valid() with Joi.ref() and custom message with messages():

password: Joi.string().min(3).max(15).required().label('Password'),
password_confirmation: Joi.any().equal(Joi.ref('password'))
    .required()
    .label('Confirm password')
    .messages({ 'any.only': '{{#label}} does not match' })

Or use options()

password: Joi.string().min(3).max(15).required().label('Password'),
password_confirmation: Joi.any().equal(Joi.ref('password'))
    .required()
    .label('Confirm password')
    .options({ messages: { 'any.only': '{{#label}} does not match'} })

Validate error will show ValidationError: "Confirm password" does not match if not match.
And show ValidationError: "Confirm password" is required if you have not pass password_confirmation.

Hope useful to someguys.

Upvotes: 33

Gergo Erdosi
Gergo Erdosi

Reputation: 42048

You can use Joi.any().valid() with Joi.ref():

password: Joi.string().min(3).max(15).required(),
password_confirmation: Joi.any().valid(Joi.ref('password')).required().options({ language: { any: { allowOnly: 'must match password' } } })

Upvotes: 44

Related Questions