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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 18:50:55