Joi 验证无法正常工作 Nodejs

问题描述 投票:0回答:1

我正在尝试验证模式,它不是很复杂,下面是我的代码

 Joi.object({
  mobile: Joi.string()
    .label('mobile')
    .pattern(/^(\+)[1-9]\d{7,14}$/)
    .messages({
      'string.pattern.base': 'Invalid mobile number',
    }),
  email: Joi.string()
    .email({ tlds: { allow: false } })
    .label('email')
    .messages({
      'string.email': 'Invalid email address',
    }),
  fullName: Joi.string()
    .label('fullName')
    .pattern(/^[A-Za-z]+[A-Za-z\s]*$/)
    .max(100)
    .messages({
      'string.pattern.base': 'The fullName must be a valid string',
    }),
  firstName: Joi.string()
    .regex(/^[A-Za-z\s]+$/i)
    .label('first name')
    .messages({
      'string.pattern.base': 'Only alphabets are allowed in first name.',
    }),
  middleName: Joi.string()
    .regex(/^[A-Za-z\s]+$/i)
    .label('middle name')
    .messages({
      'string.pattern.base': 'Only alphabets are allowed in middle name.',
      'any.required': 'Middle name is required.',
    }),
  lastName: Joi.string()
    .regex(/^[A-Za-z\s]+$/i)
    .label('last name')
    .messages({
      'string.pattern.base': 'Only alphabets are allowed in last name.',
      'any.required': 'Last name is required.',
    }),
}).or(
  'mobile', 
  'email'
).messages({
  'object.missing': 'Either mobile number or email is required',
}).or(
  'fullName', 
  'firstName'
).messages({
  'object.missing': 'Either full name or first name is required',
}).with(
  'firstName', 
  'lastName'
).messages({
  'object.with': 'If first name is provided, last name is required',
})

现在它的验证工作正常,但问题是,当我们不提供电子邮件和手机时,消息会显示需要全名或名字而不是**需要手机号码或电子邮件**,所以我该如何解决它

我尝试过多次放置,甚至使用了异或,但没有成功。请帮忙

javascript node.js typescript validation joi
1个回答
0
投票

试试这个

Joi.object({
  mobile: Joi.string()
    .label('mobile')
    .pattern(/^(\+)[1-9]\d{7,14}$/)
    .messages({
      'string.pattern.base': 'Invalid mobile number',
    }),
  email: Joi.string()
    .email({ tlds: { allow: false } })
    .label('email')
    .messages({
      'string.email': 'Invalid email address',
    }),
  fullName: Joi.string()
    .label('fullName')
    .pattern(/^[A-Za-z]+[A-Za-z\s]*$/)
    .max(100)
    .messages({
      'string.pattern.base': 'The full name must be a valid string',
    }),
  firstName: Joi.string()
    .regex(/^[A-Za-z\s]+$/i)
    .label('first name')
    .messages({
      'string.pattern.base': 'Only alphabets are allowed in first name.',
    }),
  middleName: Joi.string()
    .regex(/^[A-Za-z\s]+$/i)
    .label('middle name')
    .messages({
      'string.pattern.base': 'Only alphabets are allowed in middle name.',
      'any.required': 'Middle name is required.',
    }),
  lastName: Joi.string()
    .regex(/^[A-Za-z\s]+$/i)
    .label('last name')
    .messages({
      'string.pattern.base': 'Only alphabets are allowed in last name.',
      'any.required': 'Last name is required.',
    }),
})
.or('mobile', 'email')
.messages({
  'object.missing': 'Either mobile number or email is required',
})
.or('fullName', 'firstName')
.messages({
  'object.missing': 'Either full name or first name is required',
})
.with('firstName', 'lastName')
.messages({
  'object.with': 'If first name is provided, last name is required',
});

我猜错误显示是因为 .or() 和 .with() 方法的解释顺序可能不会产生预期的错误消息。

© www.soinside.com 2019 - 2024. All rights reserved.