Создайте проверку схемы JOI на основе условного имени параметра, чтобы определить соответствующую схему

#node.js #express #schema #joi

Вопрос:

Хотите создать проверку схемы Joi на основе имени параметра, чтобы выбрать соответствующую схему для проверки

Не Хапи/Дзеи

Параметры будут либо штатными, ассоциированными по контракту, стажерами, сезонными ассоциированными

Схемы прилагаются ниже

 var associate = Joi.object().keys({
    Job_title: Joi.string().required(),
    work_information: Joi.object().keys({
        Full_Name: Joi.string().required(),
        Email_Address: Joi.string().required(),
        phone_number: Joi.string().required(),
        company_Name: Joi.string().required(),
        manager_information: Joi.string().required(),
        gender: Joi.string().required(),
        Date_of_Birth: Joi.string().required(),
        manager_information: Joi.string().required(),
    })
});

var intern = Joi.object().keys({
    Job_title: Joi.string().required(),
    work_information: Joi.object().keys({
        Full_Name: Joi.string().required(),
        Email_Address: Joi.string().required(),
        phone_number: Joi.string().required(),
        company_Name: Joi.string().required(),
        manager_information: Joi.string().required(),
        gender: Joi.string().required(),
        Date_of_Birth: Joi.string().required(),
        manager_information: Joi.string().required(),
        university_name: Joi.string().required(),
        date_of_graduation: Joi.string().required(),
    })
});

var contractor = Joi.object().keys({
    Job_title: Joi.string().required(),
    work_information: Joi.object().keys({
        Full_Name: Joi.string().required(),
        Email_Address: Joi.string().required(),
        phone_number: Joi.string().required(),
        consulting_agency: Joi.string().required(),
    })
});

var seasonal = Joi.object().keys({
    Job_title: Joi.string().required(),
    work_information: Joi.object().keys({
        Full_Name: Joi.string().required(),
        Email_Address: Joi.string().required(),
        phone_number: Joi.string().required(),
        duration_of_employment: Joi.string().required(),
        manager_information: Joi.string().required(),
    })
});
 

Вот что у меня есть, так что

 var createAssociateProfile = Joi.object({
params: Joi.object({
    name: Joi.string().valid('full-time', 'contract-associate', 'intern-associate', 'seasonal-associate' ).required()
}),
body: Joi.object({
    Job_title: Joi.string().required(),
    work_information: Joi.object().required().when('params.name', 
            { is: 'full-time', then: associate },
            { is: 'contract-associate', then: intern},
            { is: 'intern-associate', then: contractor},
            { is: 'seasonal-associate', then: seasonal},
    )
})
 

});

Комментарии:

1. В чем заключается ваш вопрос ? Поскольку вы уже прикрепили решение, хотите ли вы более оптимизированное решение ?

2. Решение-это мой текущий прогресс, оно не работает

Ответ №1:

С помощью .when('params.name') этого вы оцениваете одноранговый объект внутри work_information объекта.

Чтобы ссылаться на первый params объект, вы должны сделать:

 .when('...params.name')
 

... это ссылка на прародителя.

Вот более подробная информация об относительных ссылках:

https://github.com/sideway/joi/blob/master/API.md#relative-references

Комментарии:

1. Похоже, это не работает. При тестировании схемы Joi путем выбора требуемого поля схема joi не выдает ошибку

2. @Pfizer в чем ошибка?

3. при проверке схемы путем доступа к конечной точке она, по-видимому, дает нам ответ на успех, который мы ищем. Однако, если вы опустите обязательное поле в запросе, проверка JOI не вернет ошибку для отсутствующего поля. Мои мысли заключаются в том, что проверка схемы не выполняется.