如何用Middy validator校验pathParameters和queryStringParameters
操作方法
1. 安装必要依赖
Middy的validator中间件没有包含在核心包内,需要单独安装,同时推荐搭配官方http-error-handler中间件自动处理校验失败的HTTP响应:
npm install @middy/validator @middy/http-error-handler
validator内部默认使用Ajv做Schema校验,不需要额外单独安装Ajv。
2. 编写校验规则替换手动判空
validator通过JSON Schema定义校验规则,可以同时覆盖pathParameters、queryStringParameters、请求体等所有API Gateway事件字段。替换后的完整代码如下:
import middy from '@middy/core' import validator from '@middy/validator' import httpErrorHandler from '@middy/http-error-handler' import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda' // 定义事件校验Schema const eventSchema = { type: 'object', required: ['pathParameters'], // 要求pathParameters整体存在 properties: { pathParameters: { type: 'object', required: ['id'], // 要求pathParameters下必须有id字段 properties: { id: { type: 'string', minLength: 1, // 禁止空字符串,匹配非空校验要求 } } }, // 按需添加queryStringParameters校验规则 queryStringParameters: { type: 'object', properties: { // 示例:校验page参数如果传了必须是数字格式字符串 page: { type: 'string', pattern: '^\\d+$' } } } } } as const async function lambdaHandler(event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> { // 经过validator校验后,不需要再手动判空 return { statusCode: 200, body: `Hello ${event.pathParameters!.id} from ${event.path}` } } const handler = middy(lambdaHandler) // 注意中间件顺序:错误处理中间件要放在最前面,才能捕获后续中间件抛出的错误 .use(httpErrorHandler()) .use(validator({ eventSchema })) export default handler
说明
- 校验不通过时,validator会自动抛出400 Bad Request错误,http-error-handler会把错误转换成格式统一的JSON响应返回给客户端,不需要手动写判空、抛错的重复逻辑。
- 如果请求没有携带query参数,API Gateway会将
queryStringParameters设为null,只要你没有在Schema的required数组里加入queryStringParameters,这种情况不会触发校验报错,符合常规接口的参数可选逻辑。 - 如果需要自定义校验失败的错误信息,可以在Schema对应字段下加
errorMessage配置,也可以在validator初始化时传入自定义的Ajv实例,实现更复杂的校验规则。 - 开启
strictNullChecks的场景下,如果不想用非空断言!,可以结合Schema推导经过校验后的事件类型,彻底消除空值判断的冗余代码。
内容的提问来源于stack exchange,提问作者Bozi
相关产品推荐
相关产品推荐

