Joi.string()

1,714 阅读7分钟

原文摘自官方 api 文档,具体请查看官网api

字符串数据类型

.allow(values)

默认情况下,空字符串被当做验证不通过。可以 .allow('')

允许特殊值

Joi.string().allow(1, 2, '')

.default(value)

默认值

需要指定什么值时,使用默认值

const schema = Joi.string().empty('a').default('aa');
schema.validate('a');
// { value: 'aa' }

.alphanum()

字符串必须包含字母和数字 a-z,A-Z,0-9

const schema = Joi.string().alphanum();

.base64([options])

验证字符串是否是有效的 base64 字符串,不检查解码值。

  • options - 可选
    • paddingRequired
      • 如果 true,必须用=字符正确填充字符串。
      • 默认为 true
    • urlSafe
      • 如果 true,使用 URI 安全 base64 格式
      • - 替换+,用_ 替换 \
      • 默认为 false.
const schema = Joi.string().base64();
schema.validate('VE9PTUFOWVNFQ1JFVFM'); 
// ValidationError: "value" must be a valid base64 string
schema.validate('VE9PTUFOWVNFQ1JFVFM='); 
// No Error

const paddingRequiredSchema = Joi.string().base64({ paddingRequired: true });
paddingRequiredSchema.validate('VE9PTUFOWVNFQ1JFVFM'); 
// ValidationError: "value" must be a valid base64 string
paddingRequiredSchema.validate('VE9PTUFOWVNFQ1JFVFM='); 
// No Error

const paddingOptionalSchema = Joi.string().base64({ paddingRequired: false });
paddingOptionalSchema.validate('VE9PTUFOWVNFQ1JFVFM'); 
// No Error
paddingOptionalSchema.validate('VE9PTUFOWVNFQ1JFVFM='); 
// No Error

.case(direction)

.uppercase();
.lowercase();

大小写转换

  • direction: 'lower' | 'upper'
const schema = Joi.string().case('lower');

.creditCard()

要求号码是信用卡号码

const schema = Joi.string().creditCard();

.dataUri([options])

要求字符串值是有效的数据 URI 字符串

  • options - 可选
    • paddingRequired
      • 是否用 = 填充。
      • 默认为 true
const schema = Joi.string().dataUri();

.domain([options])

要求字符串值是有效的域名。

  • options - 可选
    • allowUnicode
      • 如果为 true,则允许使用 Unicode 字符
      • 默认为 true
    • minDomainSegments
      • 域段所需最小的数量。
      • 默认为 2
    • maxDomainSegments
      • 允许的域段的最大数量。
      • 默认为无限制。
    • tlds
      • TLD(顶级域)验证选项。
      • 默认情况下,TLD 必须是 IANA 注册机构中,列出的有效名称。
      • 要禁用验证,请设置 tldsfalse
      • 要自定义 TLD 的验证方式,请设置以下其中一项:
        • allow - 其中之一:

          • true 使用已注册 TLD 的 IANA 列表。这是默认值。
          • false 允许 deny 列表中未列出的任何 TLD (如果存在)。
          • 一个 Set 或一组允许的 TLD。不能与 deny 的列表一起使用。
        • deny - 其中之一:

          • 一个 Set 或一组被禁止的 TLD。不能与自定义 allow 列表一起使用。

.emali([options])

要求字符串值是有效的电子邮件地址。

  • options - 可选设置:
    • allowUnicode
      • 如果为 true,则允许使用 Unicode 字符。
      • 默认为 true
    • ignoreLength
      • 如果为 true,忽略无效的电子邮件长度错误。
      • 默认为 false
    • minDomainSegments
      • 域段所需的最小数量。
      • 默认设置不包括单段域,例如 example@io 这是一个有效的电子邮件但非常不常见。
      • 默认为 2
    • maxDomainSegments
      • 允许的域段的最大数量。
      • 默认为无限制。
    • multiple
      • 如果为 true,允许在单个字符串中包含多个电子邮件地址,由, 或separator字符分隔。
      • 默认为 false
    • separator
      • multipletrue时,覆盖默认,分隔符。
      • 字符串可以是单个字符或多个分隔符。
      • 默认为','.
    • tlds
      • TLD(顶级域)验证选项。
      • 默认情况下,TLD 必须是 IANA 注册机构中 列出的有效名称。
      • 要禁用验证,请设置 tldsfalse
      • 要自定义 TLD 的验证方式,请设置以下其中一项:
        • allow - 其中之一:
          • true 使用已注册 TLD 的 IANA 列表。这是默认值。
          • false 允许deny列表中未列出的任何 TLD (如果存在)。
          • 一个Set或一组允许的 TLD。不能与deny 的列表一起使用。
        • deny - 其中之一:
          • 一个Set或一组被禁止的 TLD。不能与自定义allow 列表一起使用。

.guid([options])

.uuid()

要求字符串值是有效的 GUID。

  • options - 可选设置:
    • version
      • 指定一个或多个可接受的版本。
      • 可以是一个数组或字符串具有以下值:
        • uuidv1
        • uuidv2
        • uuidv3
        • uuidv4
        • uuidv5
      • 如果没有version指定,则假定它是一个泛型 guid,它不会验证 guid 的版本或变体,而只检查通用结构格式。
    • separator - 定义允许或需要的 GUID 分隔符,其中:
      • true- 需要一个分隔符,可以是:-
      • false - 不允许使用分隔符。
      • '-' - 需要一个破折号分隔符。
      • ':' - 需要冒号分隔符。
      • 默认为可选:-分隔符。

.hex([options])

要求字符串值是有效的十六进制字符串。

  • options - 可选
    • byteAligned - 布尔值
      • 指定要检查的十六进制字符串,是否按字节对齐
      • 如果 converttrue, 0 会被添加到需要添加的字符串前
      • 默认值 false
const schema = Joi.string().hex();

.hostname()

根据 RFC1123 要求字符串值是有效的主机名。

const schema = Joi.string().hostname();

.insensitive()

在不区分大小写的比较中,允许值匹配允许列表或不允许列表中的任何值。

const schema = Joi.string().valid('a').insensitive();

.ip([options])

要求字符串值是有效的 IP 地址。

  • options - 可选的
    • version
      • 要验证的一个或多个 IP 地址版本
      • 有效值:ipv4ipv6,ipvfuture
    • cidr
      • 用于确定是否允许 CIDR。
      • 有效值:optionalrequired,forbidden
// Accept only ipv4 and ipv6 addresses with a CIDR
const schema = Joi.string().ip({
  version: [
    'ipv4',
    'ipv6'
  ],
  cidr: 'required'
});

.isoDate()

要求字符串值采用有效的 ISO 8601 日期格式。

如果验证convert选项打开(默认启用),字符串将被强制为简化的扩展 ISO 格式 (ISO 8601)。请注意,此操作使用 javascript Date 对象,该对象不支持完整的 ISO 格式,因此使用 convert.

const schema = Joi.string().isoDate();
schema.validate('2018-11-28T18:25:32+00:00'); 
// -> No Error

schema.validate('20181-11-28T18:25:32+00:00'); 
// -> ValidationError: must be a valid 8601 date

schema.validate(''); 
// -> ValidationError: must be a valid 8601 date

.isoDuration()

要求字符串值采用有效的 ISO 8601 持续时间格式。

const schema = Joi.string().isoDuration();
schema.validate('P3Y6M4DT12H30M5S'); 
// No Error

schema.validate('2018-11-28T18:25:32+00:00'); 
// ValidationError: must be a valid ISO 8601 duration

schema.validate(''); 
// ValidationError: must be a valid ISO 8601 duration

.length(limit, [encoding])

指定所需的确切字符串长度,其中:

  • limit - 所需的字符串长度。
  • encoding - 如果指定,则使用提供的编码以字节为单位计算字符串长度。
const schema = Joi.string().length(5);
const schema = Joi.object({
  length: Joi.string().required(),
  value: Joi.string().length(Joi.ref('length'), 'utf8').required()
});

.lowercase()

要求字符串值全部为小写。如果验证convert选项打开(默认启用),字符串将被强制为小写。

const schema = Joi.string().lowercase();

.max(limit, [encoding])

指定最大字符串字符数,其中:

  • limit - 允许的最大字符串字符数
  • encoding - 如果指定,则使用提供的编码以字节为单位计算字符串长度。
const schema = Joi.string().max(10);
const schema = Joi.object({
  max: Joi.string().required(),
  value: Joi.string().max(Joi.ref('max'), 'utf8').required()
});

.min(limit, [encoding])

指定最小字符串字符数,其中:

  • limit - 所需的最少字符串字符数
  • encoding - 如果指定,则使用提供的编码以字节为单位计算字符串长度。
const schema = Joi.string().min(2);
const schema = Joi.object({
  min: Joi.string().required(),
  value: Joi.string().min(Joi.ref('min'), 'utf8').required()
});

.normalize([form])

要求字符串值采用 Unicode 规范化 形式。

如果验证convert选项打开(默认启用),字符串将被规范化。

  • form - 可选
    • 要使用的 Unicode 规范化形式
    • 有效值:
      • NFC[默认]
      • NFD
      • NFKC
      • NFKD

.pattern(regex, [name | options]) - aliases: regex

定义模式规则,其中:

  • regex- 字符串值必须与之匹配的正则表达式对象。请注意,如果模式是正则表达式,为了匹配整个键名,它必须^$
  • name - 模式的可选名称(对多个模式有用)。
  • options - 具有以下支持属性的可选配置对象:
    • name - 可选的模式名称。
    • invert- 可选的布尔标志。默认为false。如果指定为true,则将不允许提供的模式而不是必需的。

.replace(pattern, replacement)

用指定的字符串替换与给定模式匹配的字符,其中:

  • pattern- 要匹配的正则表达式对象。
  • replacement - 将替换模式的字符串。

.token()

要求字符串值仅包含 a-z、A-Z、0-9 和下划线 _。

.trim([enabled])

要求字符串值前后不包含空格。如果验证convert选项打开(默认启用),字符串将被 trim

.truncate([enabled])

指定是否按 string.max()limit 用作截断。

参数是:

  • enabled- 可选参数默认true, 允许您通过提供一个虚假值来重置 truncate 的行为。

.uppercase()

要求字符串值全部为大写。如果验证convert选项打开(默认启用),字符串将被强制为大写。

.uri([options])

要求字符串值是有效的 RFC 3986 URI。

  • options - 可选设置:
    • scheme- 指定一个或多个可接受的方案,应仅包含方案名称。可以是数组或字符串(字符串会自动转义以用于正则表达式)。
    • allowRelative- 允许相对 URI。默认为false.
    • relativeOnly- 仅限制相对 URI。默认为false.
    • allowQuerySquareBrackets- 允许在查询字符串中使用未编码的方括号。这符合 RFC 3986 标准,但类似的查询字符串abc[]=123&abc[]=456如今非常普遍。默认为false.
    • domain- 使用中指定的选项验证域组件string.domain()
// Accept git or git http/https
const schema = Joi.string().uri({
  scheme: [
    'git',
    /git+https?/
  ]
});