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
相关产品推荐
相关产品推荐

