【问题标题】:Validate delimiter separated values using JOI使用 JOI 验证分隔符分隔的值
【发布时间】:2020-10-27 02:57:52
【问题描述】:

我有一个用例,我需要验证一组由 | 分隔的值.

我关注了https://github.com/hapijs/joi/issues/570,但它引发了许多错误。 有什么办法可以做到这一点吗?

示例-AA|BB|CC|DD

现在,我需要验证所有值(AA、BB、CC、DD)都是字符串。

我相信我不能使用正则表达式,因为它只会验证第一个值。

此外,我的代码中还有许多其他验证,因此我不希望循环验证过程。

如果我不清楚,请告诉我。谢谢!

【问题讨论】:

    标签: validation joi


    【解决方案1】:

    TL;DR:

    const Joi = require('joi').extend(joi => ({
      base: joi.array(),
      coerce: (value, helpers) => ({
        value: value.split ? value.split('|') : value,
      }),
      type: 'versionArray',
    }))
    

    .extendfunction signature has changed,因为该评论已写; name 属性已被移除,CoerceFunction 应返回一个以 value 为属性的对象。

    > Joi.versionArray().validate('AA|BB|CC|DD')
    { value: [ 'AA', 'BB', 'CC', 'DD' ] }
    > Joi.versionArray().validate('AA|BB,CC|DD')
    { value: [ 'AA', 'BB,CC', 'DD' ] }
    

    从这里开始,您可以使用.items(...) 函数来验证返回数组中的每个字符串:

    > const regex = new RegExp('^[a-zA-Z]+$') // every character must be a-z or A-Z 
    undefined
    
    > Joi.versionArray().items(Joi.string().regex(regex)).validate('AA|BB|CC|DD')
    { value: [ 'AA', 'BB', 'CC', 'DD' ] }
    
    > Joi.versionArray().items(Joi.string().regex(regex)).validate('AA|BB|CC|00')
    { value: [ 'AA', 'BB', 'CC', '00' ],
      error:
       { ValidationError: "[3]" with value "00" fails to match the required pattern: /^[a-zA-Z]+$/ _original: 'AA|BB|CC|00', details: [ [Object] ] } }
    
    > Joi.versionArray().items(Joi.string().regex(regex)).validate('AA|BB,CC|DD')
    { value: [ 'AA', 'BB,CC', 'DD' ],
      error:
       { ValidationError: "[1]" with value "BB,CC" fails to match the required pattern: /^[a-zA-Z]+$/ _original: 'AA|BB,CC|DD', details: [ [Object] ] } }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-07
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      相关资源
      最近更新 更多