Проверка Hapi/Joi - разные Joi.regex в зависимости от другого значения ключа

У меня есть сценарий, в котором мне нужно проверить номер НДС с другим регулярным выражением в зависимости от страны. Итак, когда поле language равно SE, я хочу использовать это регулярное выражение /^\d{6}-\d{4}$/ в поле company.vatNo, но когда поле language равно NO, я хочу использовать это /^\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()
           })

        }
      }
    }
  }
}

Спасибо


person Jojo    schedule 07.12.2016    source источник
comment
Почему бы просто не использовать switch для установки значения регулярного выражения в зависимости от языка?   -  person Jared Smith    schedule 07.12.2016
comment
Где я могу использовать переключатель в этой ситуации? @ДжаредСмит   -  person Jojo    schedule 07.12.2016
comment
У вас есть доступ к заголовку Accept-Language, просто введите код, который проверяет его и присваивает соответствующее регулярное выражение переменной, которую вы затем используете для проверки.   -  person Jared Smith    schedule 07.12.2016
comment
@JaredSmith Я использую проверку Hapijs на маршруте, поэтому мне негде делать то, что вы предлагаете, до запуска проверки. Если я использую предварительный обработчик, он запустится после проверки. Я имею в виду, что я могу сделать то, что вы предлагаете, внутри моего обработчика, но тогда мне также нужно выполнить проверку внутри обработчика.   -  person Jojo    schedule 07.12.2016
comment
Да, я использую Hapi, но проверяю вручную. OTOH, мои варианты использования достаточно ограничены, чтобы можно было делать это вручную, YMMV.   -  person Jared Smith    schedule 07.12.2016


Ответы (1)


Вот решение. Похоже, Джой не распознает language, если vatNo находится внутри другого объекта. Но это решило проблему:

    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')
        }),
person Jojo    schedule 08.12.2016