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
相关产品推荐
相关产品推荐

