You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:17:44