hapi/joi验证 - 不同的joi.regex取决于另一个键值



我有一个场景,我需要根据哪个国家来验证具有不同正则的增值税号。因此,当字段languageSE时,我想在字段company.vatNo上使用此正则 /^d{6}-d{4}$/,但是当字段 languageNO时,我想使用这个 /^d{9}(MVA)?$/。完全工作。有人知道我如何实现这一目标吗?

这是我验证的路线:

module.exports = {
  method: 'POST',
  path: '/signup/{partner}',
  handler: createPartner,
  config: {
    validate: {
      payload: {
        language: Joi.string().allow(config.supportedLanguages).required(),
        company: {
         vatNo: {
           Joi
           .when('language', {
             is: 'SE', 
             then: Joi.string().regex(/^d{6}-d{4}$/).required()
           })
           .when('language', {
             is: 'NO',
             then: Joi.string().regex(/^d{9}(MVA)?$/).required()
           })
           .when('language', {
             is: 'FI',
             then: Joi.string().regex(/^d{7}-d{1}$/).required()
           })
        }
      }
    }
  }
}

谢谢

这是解决方案。如果vatNo在另一个对象内部,JOI似乎无法识别language。但这解决了问题:

    language: Joi.any().valid(config.supportedLanguages).required(),
    vatNo:
      Joi.alternatives()
        .when('language', {
          is: Joi.string().regex(/^(SE)$/i),
          then: Joi.string().regex(/^d{6}-d{4}$/).label('companyID')
        })
        .when('language', {
          is: Joi.string().regex(/^(NO)$/i),
          then: Joi.string().regex(/^d{9}(MVA)?$/).label('companyID')
        })
        .when('language', {
          is: Joi.string().regex(/^(FI)$/i),
          then: Joi.string().regex(/^d{7}-d{1}$/).label('companyID')
        }),

最新更新