31

I'm using Joi package for server side Validation.
I want to check if a given string is in a given list or if it is not in a given list.(define black list or white list for values)
sth like an "in" or "notIn" function. How can I do that?

var schema = Joi.object().keys({
    firstname: Joi.string().in(['a','b']),
    lastname : Joi.string().notIn(['c','d']),
});
Salar
  • 5,305
  • 7
  • 50
  • 78

3 Answers3

41

You are looking for the valid and invalid functions.
v16: https://hapi.dev/module/joi/api/?v=16.1.8#anyvalidvalues---aliases-equal
v17: https://hapi.dev/module/joi/api/?v=17.1.1#anyvalidvalues---aliases-equal

As of Joi v16 valid and invalid no longer accepts arrays, they take a variable number of arguments.

Your code becomes

var schema = Joi.object().keys({
    firstname: Joi.string().valid(...['a','b']),
    lastname: Joi.string().invalid(...['c','d']),
});

Can also just pass in as .valid('a', 'b') if not getting the values from an array (-:

thomasin
  • 601
  • 7
  • 7
  • 1
    in joi/hapi there is no option like valid or invalid :| – Badri Derakhshan Mar 30 '20 at 08:46
  • 4
    @BadriDerakhshan: If you're talking about `@hapi/joi` then there is no `@hapi/joi` anymore! that package got deprecated last month & Joi is officially back to Joi. (https://www.npmjs.com/package/@hapi/joi) (Also valid and invalid do exists in `@hapi/joi`)- which is kind of frustrating as users has to switch from Joi to @hapi/joi last year and in a year again back to Joi :-) – whoami - fakeFaceTrueSoul Aug 19 '20 at 16:52
30

How about:

var schema = Joi.object().keys({
    firstname: Joi.string().valid(['a','b']),
    lastname : Joi.string().invalid(['c','d']),
});

There are also aliases: .allow and .only

and .disallow and .not

Robert Moskal
  • 21,737
  • 8
  • 62
  • 86
0

Update from 10 Oct 2022 Now valid function requires Object

Joi.string().valid({ ...values_array }),