You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 13:15:47