Serverless环境下@middy/validator参数验证失败,默认值不生效无法获取指定状态记录求助
问题分析与解决方案
我一眼就揪出问题所在了——你的JSON Schema把queryStringParameters标记成了必填项,但当用户不传递任何查询参数时,Lambda收到的event对象里根本不会包含这个字段,直接触发了必填校验失败,导致status的默认值完全没机会生效。
核心问题拆解
从CloudWatch日志的错误详情就能明确看出:
must have required property queryStringParameters
这说明当没有查询参数时,event里不存在queryStringParameters属性,而你的Schema强制要求它必须存在,校验直接挂掉,根本走不到默认值填充的逻辑。
修复步骤
1. 修改JSON Schema
调整getAuctionsSchema,移除顶层的required: ['queryStringParameters'],同时给queryStringParameters设置默认空对象,这样AJV会在字段不存在时自动注入它,再填充status的默认值:
const getAuctionsSchema = { type: 'object', properties: { queryStringParameters: { type: 'object', default: {}, // 关键:当字段不存在时自动注入空对象 properties: { status: { default: 'OPEN', enum: ['OPEN', 'CLOSED'], }, }, }, }, }; module.exports = getAuctionsSchema;
2. 确认AJV配置有效性
你已经在middy的validator里设置了useDefaults: true,这个配置至关重要——它会让AJV自动把默认值注入到event对象中,不需要你手动处理缺失值。
修复逻辑说明
- 当用户不传递任何查询参数时,AJV会自动给event添加
queryStringParameters: {} - 接着AJV会给这个空对象注入status的默认值
OPEN - 你的Lambda代码里
const { status } = event.queryStringParameters;就能正确拿到OPEN,DynamoDB查询也能正常执行
额外测试建议
- 测试不传参数的场景:此时应返回所有
status=OPEN的记录 - 测试传递
status=CLOSED的场景:应返回对应状态的记录,验证枚举校验依然生效
内容的提问来源于stack exchange,提问作者Developer Nans
相关产品推荐
相关产品推荐

