AWS SDK Gateway getUsagePlans在Lambda中无法正常工作的问题
问题:Lambda中使用AWS JS SDK无法获取API Gateway使用计划数据
现象
执行CLI命令aws apigateway get-usage-plans可正常返回账号下的API使用计划数据,但在Lambda中运行Node.js代码时,返回结果仅包含statusCode:200,无法获取到使用计划数据。
CLI命令
aws apigateway get-usage-plans
CLI输出
{ "items": [ { "id": "3hhulv", "name": "testplan", "apiStages": [ { "apiId": "dp6ounv3jd", "stage": "default" } ], "throttle": { "burstLimit": 10, "rateLimit": 10.0 }, "quota": { "limit": 10000, "offset": 0, "period": "MONTH" } } ] }
原Node.js代码
const AWS = require('aws-sdk'); exports.handler = async (event) => { var apigateway = new AWS.APIGateway(); var params = {}; var usageplans = apigateway.getUsagePlans(params, function(err, data) { if (err) console.log(err, err.stack); // an error occurred else console.log(data); // successful response }); const response = { statusCode: 200, things : usageplans.data }; return response; };
原代码输出
{ "statusCode": 200 }
原因
- 异步处理逻辑错误:原代码混用回调函数与
async/await。apigateway.getUsagePlans用回调调用时,返回的usageplans是请求对象而非实际响应数据;且Lambda的asynchandler会直接返回response,不会等待回调执行完成,导致usageplans.data不存在。 - 未实现分页处理:即使考虑分页,原代码也没有通过
position参数循环获取所有数据,若使用计划数量超过单次返回上限,会导致数据不完整。
修复后的代码
改用async/await调用SDK的Promise版本,并实现分页逻辑以获取全部使用计划:
const AWS = require('aws-sdk'); const apigateway = new AWS.APIGateway(); exports.handler = async (event) => { let allUsagePlans = []; let params = {}; try { do { const response = await apigateway.getUsagePlans(params).promise(); allUsagePlans = [...allUsagePlans, ...response.items]; params.position = response.position; // 设置下一页的位置标记 } while (params.position); // 循环直到没有下一页 return { statusCode: 200, things: allUsagePlans }; } catch (err) { console.error('获取使用计划失败:', err); return { statusCode: 500, error: err.message }; } };
说明
- 用
await等待SDK请求完成,确保数据获取后再返回结果,避免异步逻辑导致的空值问题。 - 通过
position参数循环调用接口,收集所有分页数据。 - 添加错误捕获,返回错误信息便于排查问题。
内容的提问来源于stack exchange,提问作者ALargeRubberDuck
相关产品推荐
相关产品推荐

