Joi validation of array

HapijsJoi

Hapijs Problem Overview


trying to validate that an array has zero or more strings in one case and that it has zero or more objects in another , struggling with Joi docs :(

validate: {
	    headers: Joi.object({
                'content-type': "application/vnd.api+json",
                accept: "application/vnd.api+json"
        }).options({ allowUnknown: true }),
		payload : Joi.object().keys({
			data : Joi.object().keys({
				type: Joi.any().allow('BY_TEMPLATE').required(),
				attributes: Joi.object({
					to : Joi.string().email().required(),
					templateId : Joi.string().required(),
					categories : Joi.array().items( //trying to validate here that each element is a string),
					variables : Joi.array({
						//also trying to validate here that each element is an Object with one key and value
					})
				})
			}).required()
		})
	}

Hapijs Solutions


Solution 1 - Hapijs

Joi.array().items() accepts another Joi schema to use against the array elements. So an array of strings is this easy:

Joi.array().items(Joi.string())

Same for an array of objects; just pass an object schema to items():

Joi.array().items(Joi.object({
    // Object schema
}))

Solution 2 - Hapijs

If you want to validate an array of strings in Joi:

Joi.array().items(Joi.string().valid("item1", "item2", "item3", "item4"))

Solution 3 - Hapijs

you can try this:

function(data) {
 const Schema = {
   categories: Joi.array().items(Joi.string()),
   variables: Joi.array().items(Joi.object().keys().min(1))
 }
 return Joi.validate(data, Schema)
}

for more details checkout this repo: https://github.com/raysk4ever/nodejs_withMongoRefArray

Solution 4 - Hapijs

You can also try this way, I have been using it for long time and working fine for me.

If your array is array of objects than use below:

const Joi = require('joi');

let schema = Joi.object().keys({
            items: Joi.array().items(
                Joi.object({
                    item_id: Joi.number().required(),
                    item_qty: Joi.number().required(),
                    item_type_id: Joi.number().required(),
                    item_qty: Joi.number().required(),
                    base_price: Joi.number().required(),
                    actual_price: Joi.number().required(),
                })
            ).required(),
        });

        let errors = Joi.validate(req.body, schema);

if you array is simple array than:

let schema = Joi.object().keys({
                items: Joi.array().items(
                Joi.number().required()
            ).min(10).required(),
            });

Solution 5 - Hapijs

Joi.array().items(Joi.string().required(), Joi.number().required()); found it here

Solution 6 - Hapijs

Validation when we have an array of objects using Joi:

const schema = Joi.array().items(
Joi.object().keys({
  id: Joi.number().required(),
  name: Joi.string().required(),
}));

We could add validations for objects inside an array itself.

Solution 7 - Hapijs

validate: {
	    headers: Joi.object({
                'content-type': "application/vnd.api+json",
                accept: "application/vnd.api+json"
        }).options({ allowUnknown: true }),
		payload : Joi.object().keys({
			data : Joi.object().keys({
				type: Joi.any().allow('BY_TEMPLATE').required(),
				attributes: Joi.object({
					to : Joi.string().email().required(),
					templateId : Joi.string().required(),
					categories : Joi.array().items(Joi.string()),
					variables : Joi.array().items(Joi.object().keys().max(1))
				})
			}).required()
		})
	}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Question1977View Question on Stackoverflow
Solution 1 - HapijscdhowieView Answer on Stackoverflow
Solution 2 - HapijsfIwJlxSzApHEZIlView Answer on Stackoverflow
Solution 3 - HapijsRavi SinghView Answer on Stackoverflow
Solution 4 - HapijsPrashantAjaniView Answer on Stackoverflow
Solution 5 - HapijschavyView Answer on Stackoverflow
Solution 6 - HapijsKhushal VyasView Answer on Stackoverflow
Solution 7 - Hapijs1977View Answer on Stackoverflow