web-dev-qa-db-fra.com

Comment valider un tableau d'objets en utilisant Joi?

J'obtiens un tableau d'objets à gérer, où chaque objet contient un nom de service. La structure ressemble à celle ci-dessous

[{"serviceName":"service1"},
{"serviceName":"service2"},..]

quand je reçois le tableau en arrière-plan, je veux valider que chaque objet du tableau a la propriété serviceName. 

J'avais écrit le code suivant, mais même si je passe un tableau valide, j'obtiens une erreur de validation.

var Joi = require('joi');
var service = Joi.object().keys({
  serviceName: Joi.string().required()
});

var services = Joi.array().ordered(service);

var test = Joi.validate([{serviceName:'service1'},{serviceName:'service2'}],services)

Pour le code ci-dessus, je reçois toujours l'erreur de validation avec le message

"value" at position 1 fails because array must contain at most 1 items
21
zakir

remplacer orders par items fonctionnera.

let Joi = require('joi')
let service = Joi.object().keys({
  serviceName: Joi.string().required(),
})

let services = Joi.array().items(service)

let test = Joi.validate(
  [{ serviceName: 'service1' }, { serviceName: 'service2' }],
  services,
)

Pour référence cliquez ici

42
zakir

Vous pouvez également essayer ceci. Soi-disant, nous ne connaissons pas la longueur des données ni les données réelles renvoyées en cas de réponse de la part de l'interface de programmation thridparty .. .. Dans ce cas, j'estime que cela serait utile. J'essaie d'utiliser la fonctionnalité _.each de lodash pour valider les données.

//readCourseObject.js
const Joi = require('joi');
const CourseObjectKeys = Joi.object().keys({
    appObj: Joi.string().strict().required(),
    id:Joi.number().strict().required(),
    name: Joi.string().strict().min(3).required(),
    version: Joi.number().strict().min(1).required()

});

module.exports = CourseObjectKeys;


//I am trying to read a json file here for simplicity
//ReadCourseContents.js
const fs = require('fs');
const path = require('path');

const ErrorConstant = require('../models/errorConstants');
const errorConstantObj = new ErrorConstant();

const _ = require('lodash');
const Joi = require('joi');
const courseObjectKeys = require('../models/coureObjectKeys');

const CourseValidator = require('../validators/courseValidation');
const courseValidatorObj  = new CourseValidator();

let filePath = path.resolve(__dirname+'./../../resources/courseData.json');

class ReadCourseDataJsonSync{
    readFile(requestParamId){

        let bufferedData = fs.readFileSync(filePath);
        console.log('bufferedData course data json>', bufferedData);
        let jsonCourseData = JSON.parse(bufferedData);
        console.log('json data read,', jsonCourseData);  


        if(requestParamId === null){
            let courseArray = this.readAllData(jsonCourseData)
            console.log('course array before being retruned:',courseArray);
           return courseArray;
        }else {
           return this.readSelectedId(jsonCourseData, requestParamId);
        }
    }

    //Read All data
    readAllData(jsonData){
        let courseObjectKeysArray = [];
        if( _.isArray(jsonData.courseDatas)){
            _.each(jsonData.courseDatas, (data)=>{
                console.log('each element in json:', data);
                Joi.validate({appObj:'sample', id:jsonData.id, name: name.course_name, version:data.version}, courseObjectKeys, (err, value)=>{
                    if(err){
                        console.log('error is thrown', err);
                        errorConstantObj.setErrorStatus(500);
                        errorConstantObj.setErrorMessage('Invalid course data json.Find stack trace in the errorObj');
                        errorConstantObj.setErrorObject(err);
                        errorConstantObj.setErrorDescription('Cannot add course json data because of invalid data present in json');
                        return errorConstantObj;
                    }else{
                        courseObjectKeysArray.Push(data);
                    }
                });

            });


            console.log('courseObjectKeys', courseObjectKeysArray);
            return courseObjectKeysArray;
        }else {
            console.log('only one element in json:', jsonData);
            Joi.validate({appObj:'sample', id:jsonData.id, name: jsonData.course_name, sdsd:data.version}, courseObjectKeys, (err, value)=>{
                if(err){
                    console.log('error is thrown', err);
                    errorConstantObj.setErrorStatus(500);
                    errorConstantObj.setErrorMessage('Invalid course data json.Find stack trace in the errorObj');
                    errorConstantObj.setErrorObject(err);
                    errorConstantObj.setErrorDescription('Cannot add course json data because of invalid data present in json');
                    return errorConstantObj;
                }else{
                    return value;
                }
            });

        }
    }

    //read a single ID
    readSelectedId(jsonData, requestParamId){ 
        let value;
       console.log('validation of id:',courseValidatorObj.validateCourse(true, requestParamId));
       if(courseValidatorObj.validateCourse(true, requestParamId)){
        value =  _.find(jsonData, {requestParamId});
        console.log('value found in array', value);
        return value;
       }else{
          const err = new Error('Incorrect id passsed for the course. No data to fetch');
        errorConstantObj.setErrorStatus(420);
        errorConstantObj.setErrorMessage('Incorrect id passsed for the course. No data to fetch');
        errorConstantObj.setErrorObject(err);
        errorConstantObj.setErrorDescription('Desc- Incorrect id passsed for the course. No data to fetch');
        return errorConstantObj;
       }    
    }

}



module.exports = ReadCourseDataJsonSync;

Remarque: encore une fois pour la simplicité, des appels synchrones sont utilisés

0
Joey587