AWS DynamoDB中addTodo函数重复存储及校验异常仍存储问题排查
问题原因分析与修复方案
核心问题:中间件错误处理不符合Middy规范
你的异常行为根源在于validator.js中的before钩子错误处理方式不正确,导致Middy无法正确拦截错误,进而执行了不该执行的数据库存储逻辑。
1. 校验错误时仍存储条目的原因
在bodyValidator的before钩子中,你直接使用throw抛出错误,但Middy的同步钩子规范要求:若要终止流程并触发错误处理,需调用next(error)而非直接throw。直接throw的错误无法被Middy的中间件流程正确捕获,导致跳过错误处理逻辑,继续执行主handler的DynamoDB存储代码。
2. 校验通过时重复存储的原因
当校验通过时,你调用了next()继续流程,但由于之前的错误处理逻辑混乱(直接throw未被拦截),导致Middy的流程出现异常,触发handler多次执行,最终造成条目重复存储。
修复方案
步骤1:修正validator.js的错误处理逻辑
将直接throw改为调用next(error),并在抛出错误后添加return阻止后续代码执行,同时新增JSON解析错误的捕获:
exports.bodyValidator = (schema) => ({ before: (handler, next) => { const { body } = handler.event; if (!body) { next(new Error("Empty request body!")); return; // 阻止后续代码执行 } try { const data = JSON.parse(body); const { error } = schema.validate(data, { abortEarly: false }); if (error) { const validationErrors = error.details.map(detail => detail.message); next(new Error(`Validation failed: ${validationErrors.join(', ')}`)); return; // 阻止后续代码执行 } else { next(); // 校验通过,继续执行handler } } catch (parseError) { // 捕获JSON格式错误 next(new Error(`Invalid JSON body: ${parseError.message}`)); return; } }, });
步骤2:优化addTodo.js的body解析逻辑
避免重复解析event.body,提升代码效率:
// 替换原有的两次JSON.parse const body = JSON.parse(event.body); const { todo, priority } = body;
步骤3:确认Middy中间件顺序
你的现有中间件顺序authorize → bodyValidator → errorHandler是正确的,无需调整。
验证修复效果
- 校验错误时:Middy会正确拦截错误,跳过主handler的存储逻辑,直接返回错误响应。
- 校验通过时:流程正常执行一次,仅存储一条条目。
内容的提问来源于stack exchange,提问作者hackmaster
相关产品推荐
相关产品推荐

