如何基于Joi验证器中对象外部的字段进行条件验证

问题描述

我有一个如下所示的验证架构:

const createdJobOpportunitySchema = Joi.object({
        countryWhereTheEmploymentHeld: Joi.string().valid('Local','Forign').required(),employerAddress: Joi.object({
            region: Joi.when('countryWhereTheEmploymentHeld',{
                is: Joi.string().valid('Local'),then: Joi.string().required(),}),zone: Joi.string().custom(mongoObjectIdValidator,'Region Validator'),district: Joi.string().custom(mongoObjectIdValidator,})
    });

所以我想做的是根据“countryWhereTheEmploymentHeld”的值验证“地区”。如果“countryWhereTheEmploymentHeld”的值是“Local”,那么我希望该区域是必需的()。否则我不希望它是必需的()。我可以在 Joi 验证器中做到这一点。

解决方法

您的 employerAddress 对象是可选的,这意味着您的 when 验证仅在您发送 employerAddress 对象时有效。要强制将 employerAddressemployerAddress.region 放在一起,您必须将 .when 放在对象之外:

Joi.object({
  countryWhereTheEmploymentHeld: Joi.string().valid('Local','Forign').required(),employerAddress: Joi.object({
    region: Joi.string()
  }),zone: Joi.string(),district: Joi.string()
}).when(Joi.object({ countryWhereTheEmploymentHeld: Joi.valid('Local') }).unknown(),{
   then: Joi.object({ 
     employerAddress: Joi.object({
       region: Joi.required()
     }).required() 
   })
})