AdonisJS如何在HTTP请求场景外使用验证器类校验指定数据
首先你当前代码存在两个明显错误需要先修正:
- 验证器构造函数接收的是HTTP上下文对象,你把待校验的字段直接传入构造函数的写法是错误的
- 验证器中定义的经纬度字段是
lng,你传参时写的long字段名不匹配,且代码中存在ainputs的笔误
实现步骤
方式1:不修改原有验证器类,直接模拟空上下文调用
因为你当前的验证器逻辑完全没有用到上下文对象,只需要在实例化时传入空对象满足构造函数要求即可,代码如下:
import { validator } from '@ioc:Adonis/Core/Validator' import CreateUserValidator from 'App/Validators/CreateUserValidator' import type { HttpContextContract } from "@ioc:Adonis/Core/HttpContext"; // 这是你待校验的任意数据源,不需要来自HTTP请求 const dataToValidate = { lat: "30.1234", lng: "120.5678", radius: 1000, distance: 500 } try { const validated = await validator.validate({ schema: new CreateUserValidator({} as HttpContextContract).schema, data: dataToValidate, messages: new CreateUserValidator({} as HttpContextContract).messages }) // 校验通过,validated就是处理后的数据 console.log(validated) } catch (error) { // 校验失败,处理错误信息 console.log(error.messages) }
方式2:优化验证器类,彻底移除上下文依赖(推荐后续复用)
你可以直接修改验证器,把不需要的上下文依赖去掉,后续任意场景都可以直接调用:
// 修改后的CreateUserValidator.ts import { schema, rules } from "@ioc:Adonis/Core/Validator"; export default class CreateUserValidator { static schema = schema.create({ lat: schema.string({}, [ rules.regex(/^[-]?(([0-8]?[0-9])\.(\d+))|(90(\.0+)?)$/), ]), lng: schema.string({}, [ rules.regex(/^[-]?((((1[0-7][0-9])|([0-9]?[0-9]))\.(\d+))|180(\.0+)?)$/), ]), radius: schema.number(), distance: schema.number(), }); static messages = {}; }
调用时不需要再处理上下文,直接使用即可:
import { validator } from '@ioc:Adonis/Core/Validator' import CreateUserValidator from 'App/Validators/CreateUserValidator' const dataToValidate = { lat: "30.1234", lng: "120.5678", radius: 1000, distance: 500 } try { const validated = await validator.validate({ schema: CreateUserValidator.schema, data: dataToValidate, messages: CreateUserValidator.messages }) } catch (error) { console.log(error.messages) }
内容的提问来源于stack exchange,提问作者Smit Gajera
相关产品推荐
相关产品推荐

