如何将API Gateway查询参数传递给Node.js版AWS Lambda函数
问题解决:API Gateway查询参数传递到Lambda函数的错误修复
错误原因
报错Cannot read properties of undefined (reading 'skuid')是因为代码直接访问event['queryStringParameters']['skuid'],但当queryStringParameters不存在时(比如API Gateway集成配置问题,或请求未携带参数),就会触发类型错误。另外原代码中event.skuid的写法不符合API Gateway默认的参数传递规则——query参数不会直接挂载到event根节点。
修复步骤
1. 安全获取查询参数
使用可选链操作符或分步判断,避免直接访问可能为undefined的属性。同时添加参数缺失时的错误处理:
修改Lambda函数中获取skuId的代码:
// 安全获取skuid,处理queryStringParameters不存在的情况 const skuId = event?.queryStringParameters?.skuid; // 检查参数是否存在 if (!skuId) { return { statusCode: 400, body: JSON.stringify({ message: '缺少必填参数skuid' }), }; }
2. 完整修复后的Lambda代码
import { DynamoDBClient, ScanCommand } from '@aws-sdk/client-dynamodb'; import { unmarshall } from '@aws-sdk/util-dynamodb'; const dbclient = new DynamoDBClient({ region: 'us-west-2', // 替换为你的AWS区域 }); export const handler = async (event) => { // 安全获取查询参数 const skuId = event?.queryStringParameters?.skuid; // 参数校验 if (!skuId) { return { statusCode: 400, body: JSON.stringify({ message: '缺少必填参数skuid' }), }; } try { const scanParams = { TableName: 'products', }; const scanResponse = await dbclient.send(new ScanCommand(scanParams)); const items = scanResponse.Items || []; const foundItem = items.find(item => { return ( item.variants && item.variants.L && item.variants.L.some(variant => variant.M.sku.S === skuId) ); }); if (!foundItem) { return { statusCode: 404, body: JSON.stringify({ message: '未找到对应商品' }), }; } return { statusCode: 200, body: JSON.stringify(unmarshall(foundItem)), }; } catch (err) { return { statusCode: 500, body: JSON.stringify({ message: err.message }), }; } };
3. 验证API Gateway集成配置
如果修改代码后仍有问题,检查API Gateway的集成类型:
- 若使用LAMBDA_PROXY集成(推荐):API Gateway会自动将请求参数(包括queryStringParameters)封装到event对象中,无需额外配置。
- 若使用自定义集成:需要在集成请求中配置映射模板,将查询参数映射到Lambda的输入参数。例如,对于REST API,映射模板(Content-Type为application/json)可设置为:
{ "queryStringParameters": "$input.params()" }
内容的提问来源于stack exchange,提问作者Faraz
相关产品推荐
相关产品推荐

