Shifut Hossain
Shifut Hossain

Reputation: 1699

How to set custom error messages in @hapi/joi?

I've created following Schema for validation using Joi:

const createProfileSchema = Joi.object().keys({
  username: Joi.string()
    .required()
    .message("username is required")
    .empty()
    .message("username is not allowed to be empty")
    .min(5)
    .message("username must be greater than 5 characters")
    .max(20)
    .message("username must be less than 5 characters")
});

But it throws the flowing error:

 Cannot apply rules to empty ruleset or the last rule added does not support rule properties

      4 |   username: Joi.string()
      5 |     .required()
    > 6 |     .message("username is required")
        |      ^
      7 |     .empty()
      8 |     .message("username is not allowed to be empty")
      9 |     .min(5)

Actually I want to set a custom message for every individual error case.

Upvotes: 19

Views: 26944

Answers (3)

Tirath Sharma
Tirath Sharma

Reputation: 115

Most of the time you may want to pass custom error message for all cases in current property schema.

Joi.object().keys({
            full_name: Joi.string()
                .required()
                .messages({ "*": "Please enter Full Name" }),
            username: Joi.string().regex(REGEX_USERNAME).required().messages({
                "*": "Please enter Username of {full_name}",
            }),
            email: Joi.string().regex(REGEX_EMAIL).required().messages({
                "*": "Please enter valid email of {full_name}",
            }),
            user_type: Joi.string()
                .valid(...Object.values(USER_TYPE))
                .required()
                .messages({
                    "*": "Please tell User Type of {full_name}",
                }),
        }),

Additional Information
Where full_name in custom error message is a variable where joi will automatically put the value provided for full_name.

Upvotes: -1

SuleymanSah
SuleymanSah

Reputation: 17858

You can try something like this with latest version of @hapi/joi package.

const Joi = require("@hapi/joi");

const createProfileSchema = Joi.object().keys({
  username: Joi.string()
    .required()
    .empty()
    .min(5)
    .max(20)
    .messages({
      "string.base": `"username" should be a type of 'text'`,
      "string.empty": `"username" cannot be an empty field`,
      "string.min": `"username" should have a minimum length of {#limit}`,
      "string.max": `"username" should have a maximum length of {#limit}`,
      "any.required": `"username" is a required field`
    })
});

const validationResult = createProfileSchema.validate(
  { username: "" },
  { abortEarly: false }
);

console.log(validationResult.error);

Detailed info can be found in docs:

https://github.com/hapijs/joi/blob/master/API.md#list-of-errors

Upvotes: 49

Sven.hig
Sven.hig

Reputation: 4519

You can try this

const Joi = require("@hapi/joi"); // as of v16.1.8

const createProfileSchema = Joi.object().keys({
  username: Joi.string()
    .required()
    .empty()
    .min(5)
    .max(20)
    .error(errors=>{ 
     errors.forEach(err=>{  
     switch(err.code){
         case "string.empty":
         err.message='Please insert username'
         break

         case "string.max":
         err.message='username is not allowed to be empty'
         break
        }
      })
    return errors
});

Upvotes: 5

Related Questions