AdonisJS Validator正确传参仍抛出必填校验错误如何解决
AdonisJS Validator全字段必填错误排查方案
排查点1:请求Content-Type配置校验
AdonisJS 仅对携带正确请求头的请求自动解析结构化参数:
- 发送JSON格式参数时,请求头必须携带
Content-Type: application/json - 发送
x-www-form-urlencoded格式参数时,需确认config/bodyparser.ts中form.enabled配置为true - 发送
form-data格式参数时,需确认config/bodyparser.ts中multipart.enabled配置为true
注意:部分调试工具会直接打印原始请求payload,即使bodyparser未解析成功也能在
console.log(ctx.request.body())中看到内容,但校验器只会读取bodyparser处理后的结构化数据,因此会出现能打印参数但校验失败的情况。
排查点2:参数层级匹配校验
你当前的校验器配置是直接校验根层级的username、email等字段,如果你的请求参数外层包裹了额外父级对象(例:{"data": {"username": "test", ...}}),校验器会找不到对应根字段触发必填错误。如果确实需要嵌套传参,可调整校验器schema结构:
public schema = schema.create({ data: schema.object().members({ username: schema.string({}, [ rules.alpha(), rules.unique({ table: 'users', column: 'username' }), ]), email: schema.string({}, [rules.email(), rules.unique({ table: 'users', column: 'email' })]), password: schema.string({}), rol: schema.enum([Rol.MANAGER, Rol.SUPERUSER, Rol.WORKER]), }) })
排查点3:校验器调用方式适配
- AdonisJS v5 版本你当前的调用方式
await ctx.request.validate(CreateUserValidator)符合规范 - 如果你使用的是 AdonisJS v6 版本,需要调整调用方式:
import validator from '@adonisjs/validator/services/main' // 在store方法中调用 await validator.validate({ schema: CreateUserValidator.schema, messages: CreateUserValidator.messages, data: ctx.request.body() })
排查点4:Bodyparser白名单配置校验
检查config/bodyparser.ts中的allowedFields配置项,如果你设置了字段白名单但未包含username、email等提交字段,bodyparser会自动过滤这些字段,导致校验器读取不到参数。
排查点5:请求方法与参数位置校验
如果你使用GET请求提交参数,参数会被解析到ctx.request.qs()而非ctx.request.body(),校验器默认校验body内的字段,此时需要手动指定校验数据源:
await ctx.request.validate({ schema: CreateUserValidator.schema, messages: CreateUserValidator.messages, data: ctx.request.qs() })
内容的提问来源于stack exchange,提问作者ManuC12
相关产品推荐
相关产品推荐

