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

AWS Lambda处理PUT请求返回'Unsupported route'错误排查

API Gateway + Lambda 处理PUT请求返回"Unsupported route"问题排查

问题背景

尝试通过API Gateway配置AWS Lambda函数,让同一端点/userService/items同时处理GET和PUT请求:

  • GET请求通过user_id查询数据(目前正常)
  • PUT请求通过user_id更新数据(持续返回"Unsupported route"错误)

错误信息

{
  "statusCode": 400,
  "body": "\"Unsupported route: \\\"PUT /userService/items\\\"\"",
  "headers": {
    "Content-Type": "application/json"
  }
}

PUT请求测试事件

{
  "routeKey": "PUT /userService/items",
  "body": "{ \"user_id\": \"123\", \"name\": \"Jane Doe\", \"age\": 28 }"
}

Lambda代码

import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import { DynamoDBDocumentClient, GetCommand, PutCommand } from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});
const dynamo = DynamoDBDocumentClient.from(client);
const tableName = "user";

export const handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json",
  };
  try {
    if (event.routeKey == "GET /userService/items/{user_id}") {
      const result = await dynamo.send(
        new GetCommand({
          TableName: tableName,
          Key: {
            user_id: event.pathParameters.user_id,
          },
        })
      );
      body = result.Item;
    } else if (event.routeKey == "PUT /userService/items") {
      let requestJSON = JSON.parse(event.body);
      await dynamo.send(
        new PutCommand({
          TableName: tableName,
          Item: {
            user_id: requestJSON.user_id,
            age: requestJSON.age,
            name: requestJSON.name,
          },
        })
      );
      body = `Put item ${requestJSON.user_id}`;
    } else {
      throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers,
  };
};

已尝试调整测试事件和路由配置的末尾斜杠,但路由键看似匹配的情况下仍报错,求原因及解决方法。


问题排查与解决方法

1. 确认实际传入的routeKey值

测试事件里的routeKey可能和API Gateway实际转发的不一致,在Lambda handler开头添加日志打印实际值:

console.log("Received routeKey:", event.routeKey);

部署后发起真实PUT请求,查看Lambda日志,就能知道实际传过来的路由键是什么——比如可能存在大小写差异(比如API Gateway里是PUT /userservice/items)、额外的斜杠或者路径前缀。

2. 核对API Gateway的路由配置

  • 检查PUT路由的路由键格式是否和Lambda代码中的PUT /userService/items完全一致,包括大小写、路径分隔符、是否带参数
  • 确认PUT路由已经正确绑定到目标Lambda函数,没有误绑定到其他函数或者未绑定
  • 检查是否有优先级更高的路由(比如带通配符的PUT /userService/{proxy+})先匹配了请求,导致当前路由未被触发

3. 检查API Gateway的部署状态

修改路由配置后,必须重新部署API Gateway的阶段,否则新配置不会生效——很多时候都是修改了路由但没部署导致的问题。

4. 修正Lambda中的匹配逻辑(可选)

如果发现routeKey有细微差异(比如末尾斜杠),可以用更灵活的匹配方式,比如:

// 忽略末尾斜杠的差异
else if (event.routeKey.replace(/\/$/, "") === "PUT /userService/items") {
  // PUT处理逻辑
}

内容的提问来源于stack exchange,提问作者user121443

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:55:56