Node.js中如何使用Joi验证默认带+91印度区号的手机号
Joi 实现印度(+91)手机号校验方案
你当前把phone字段定义为Number类型其实不太合理:手机号属于标识字符串,不参与数值运算,存为数字类型很容易出现前导零丢失、超长精度溢出的问题,建议把对应数据库Schema里的phone类型调整为String,下面是可直接用的Joi校验实现:
核心校验规则
- 固定默认国家区号为印度
+91 - 手机号主体匹配印度运营商实际号段:10位长度,首位为6-9
- 兼容用户输入的多种格式:带/不带+91前缀、带空格/横杠分隔都能识别,校验通过后自动统一为标准
+91开头的格式
可直接复用的校验代码
const Joi = require('joi'); const userValidateSchema = Joi.object({ phone: Joi.string() // 基础格式正则校验 .pattern(/^(\+91[\s-]?)?[6-9]\d{9}$/) // 自定义格式化逻辑,统一输出标准格式 .custom((value) => { // 先剔除输入里所有非数字字符 const pureDigits = value.replace(/\D/g, ''); // 如果用户只输了10位主体号码,自动补91前缀 const fullNumber = pureDigits.length === 10 ? `91${pureDigits}` : pureDigits; // 返回带+号的标准印度手机号格式 return `+${fullNumber}`; }) .required() .messages({ 'string.pattern.base': '请输入有效的印度手机号', 'any.required': '手机号不能为空' }), // 其余字段按你原有业务逻辑补充即可 });
如果你一定要保留Number类型存储
注意这种写法有精度风险,仅做适配参考:
phone: Joi.alternatives() .try(Joi.number(), Joi.string()) .pattern(/^(\+91[\s-]?)?[6-9]\d{9}$/) .custom((value) => { const pureDigits = value.toString().replace(/\D/g, ''); return Number(pureDigits.length === 10 ? `91${pureDigits}` : pureDigits); })
校验效果参考
- 输入
9812345678:校验通过,格式化后值为+919812345678 - 输入
+91 98123-45678:校验通过,格式化后值为+919812345678 - 输入
1234567890:校验不通过(首位不符合印度手机号段规则) - 输入
981234567:校验不通过(号码长度不足)
内容的提问来源于stack exchange,提问作者user19180062
相关产品推荐
相关产品推荐

