2016-12-07 59 views
0

我有一个场景,我需要验证具有不同正则表达式的增值编号,具体取决于它是哪个国家。所以,当现场languageSE我想使用这个表达式/^\d{6}-\d{4}$/场上company.vatNo,但是当现场languageNO我想用这一个/^\d{9}(MVA)?$/ ..我想我可以淳佳的时候()去,但它似乎不一起工作。有人知道我能做到吗?Hapi/Joi验证 - 根据另一个关键值的不同Joi.regex

这是我的路在哪里验证:

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() 
      }) 

     } 
     } 
    } 
    } 
} 

感谢

+0

为什么不只是使用'switch'来设置基于语言的正则表达式的值呢? –

+0

在这种情况下,我可以在哪里使用交换机? @JaredSmith – Jojo

+0

您可以访问Accept-Language头文件,只需放入一个代码来检查它并将适当的正则表达式分配给一个变量,然后用它来验证。 –

回答

2

这里的解决方案。如果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') 
     }), 
相关问题