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

Fastify请求Schema验证异常:数字手机号未触发校验错误

问题分析与解决方案

问题原因

Fastify 默认使用 AJV(Another JSON Schema Validator)做校验,并且默认开启了类型强制转换(coerceTypes: true)。当传入数字类型的MobilePhone时,AJV会自动把数字转为字符串,转换后的字符串刚好匹配[0-9]{10}的规则,因此没触发预期的校验错误。

解决方案

你可以通过两种方式关闭类型强制转换,让校验严格匹配定义的类型:

方式1:全局禁用类型强制转换

创建Fastify实例时,配置AJV的coerceTypes为false:

const app = fastify({
  ajv: {
    coerceTypes: false
  }
})

方式2:单个路由级别禁用

如果不想全局修改,可在特定路由的schema配置中单独关闭:

app.post(`/createProfile`,
    {
      schema: {
        body: {
          ...profileSchema,
          coerceTypes: false // 仅对该路由生效
        },
      }
    },
    createProfile
)

额外优化建议

  • 给MobilePhone的pattern加上^和$锚点,确保完整匹配10位数字,避免长字符串被误判:
    MobilePhone: {
      type: 'string',
      pattern: '^[0-9]{10}$',
    }
    
  • 在根schema中添加additionalProperties: false,防止请求传入未定义的字段:
    export const profileSchema = {
      type: 'object',
      properties: {
        // ... 现有字段定义
      },
      additionalProperties: false // 禁止额外字段
    } as const
    

效果验证

修改后传入数字类型的MobilePhone,Fastify会返回400错误,提示MobilePhone should be string,符合预期校验逻辑。

内容的提问来源于stack exchange,提问作者Not A Robot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:43:15