Your desired results can be achieved using the alter
method. Here's an example.
const validateUser = (user, requestType) => {
let schema = Joi.object({
email: Joi.string().email().required(),
//Here, we want to require password when request is POST.
//Also we want to remove password field when request is PUT
password: Joi.string()
.min(1)
.max(256)
.alter({
//For POST request
post: (schema) => schema.required(),
//For PUT request
put: (schema) => schema.forbidden(),
}),
});
return schema.tailor(requestType).validate(user);
};
Then in our route we call the function and pass the arguments like so:
//For POST
const { error } = validateUser({email: "me@mail.com"}, "post");//error: "password is a required field"
//For PUT
const { error } = validateUser({email: "me@mail.com"}, "put");//error: undefined (no error)