【问题标题】:Hapi/Joi validation - different Joi.regex depending on another key valueHapi/Joi 验证 - 不同的 Joi.regex 取决于另一个键值
【发布时间】:2016-12-08 22:48:06
【问题描述】:

我有一个场景,我需要使用不同的正则表达式验证增值税号,具体取决于它所在的国家/地区。所以当language字段是SE我想在company.vatNo字段上使用这个正则表达式/^\d{6}-\d{4}$/,但是当language字段是NO我想用这个/^\d{9}(MVA)?$/..我以为我可以使用 Joi 的 when(),但它似乎根本不起作用。有谁知道我如何做到这一点?

这是我验证的路线:

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

        }
      }
    }
  }
}

谢谢

【问题讨论】:

  • 为什么不直接使用switch 来根据语言设置正则表达式的值?
  • 在这种情况下我可以在哪里使用开关? @JaredSmith
  • 您可以访问 Accept-Language 标头,只需输入一个检查它的代码并将适当的正则表达式分配给一个变量,然后您可以使用该变量进行验证。
  • @JaredSmith 我在路由中使用 Hapijs 验证,所以在验证运行之前我无处可做您的建议。如果我使用预处理程序,它将在验证后运行。我的意思是,我可以在我的处理程序中执行您的建议,但是我还需要在处理程序中进行验证。
  • 是的,我使用 Hapi 但手动验证。 OTOH,我的用例非常有限,可以手动完成,YMMV。

标签: javascript node.js hapijs joi


【解决方案1】:

这是解决方案。如果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')
        }),

【讨论】:

    猜你喜欢
    • 2020-05-30
    • 2018-09-24
    • 2013-10-19
    • 1970-01-01
    • 2019-10-10
    • 2019-06-04
    • 2018-05-25
    • 2020-08-28
    • 2018-07-25
    相关资源
    最近更新 更多