AWS API Gateway非代理集成REST API调用返回NULL如何解决?
问题1:返回格式不匹配非代理集成要求
你当前Lambda返回的{statusCode, body}结构是Lambda代理集成专用的返回格式,使用非代理集成时API Gateway不会解析这个结构,二选一修复即可:
- 方案A(推荐,改动更小):在API Gateway的集成请求配置中,直接将集成类型切换为「Lambda代理集成」,原有CORS配置保持不变即可,API Gateway会自动透传Lambda返回的状态码、响应体和头信息。
- 方案B(保持非代理集成):
- 修改Lambda返回值,直接返回业务内容即可,不需要包裹statusCode、body结构,比如成功时直接返回
{"deviceData": data},报错时直接返回错误信息对象。 - 在集成响应的200状态配置中新增映射模板,内容类型填
application/json,模板内容填$input.path('$'),将Lambda的返回直接透传给前端。
- 修改Lambda返回值,直接返回业务内容即可,不需要包裹statusCode、body结构,比如成功时直接返回
问题2:异步错误未捕获导致返回null
你当前的try/catch只能捕获同步代码异常,ddb.scan(params).promise()是异步操作,它的reject错误不会被现有catch捕获,一旦出现权限不足、表不存在这类问题,就会触发未处理的Promise rejection,Lambda执行异常就会返回null,修改后参考代码如下:
var AWS = require('aws-sdk'); const ddb = new AWS.DynamoDB.DocumentClient({region : 'us-west-2'}); exports.handler = async (event) => { console.log("触发事件:", JSON.stringify(event)) if(event.httpMethod==='GET') { console.log("GET method if is called") try { const data = await readDatabase(event); // 代理集成用下方返回 return { statusCode: 200, headers: { "Access-Control-Allow-Origin": "*" }, body : JSON.stringify({ "deviceData" : data }) } // 非代理集成直接返回 { "deviceData": data } 即可 } catch (e) { console.error("执行错误:", e) // 代理集成用下方返回 return { statusCode: 400, headers: { "Access-Control-Allow-Origin": "*" }, body: JSON.stringify({ "Message": "Error in Read From Database function", "Details": e.message }) } // 非代理集成直接返回错误信息对象即可 } } // 补充其他请求类型的返回,避免无返回值导致null return { statusCode: 405, body: JSON.stringify({message: "Method Not Allowed"}) } }; async function readDatabase(event) { console.log("inside readDatabase function") let params = { TableName: 'devicedata', }; return await ddb.scan(params).promise() }
问题3:检查Lambda执行角色权限
确认你的Lambda对应的IAM执行角色,已经附加了允许dynamodb:Scan操作的权限策略,资源需要包含你的devicedata表的ARN,没有权限的话scan会直接报错导致返回null。
问题4:部署API生效配置
所有API Gateway的配置修改完成后,必须点击「部署API」并选择对应的部署阶段,否则配置不会生效,依旧会返回旧的结果。
调试建议
先在Lambda控制台使用模拟API Gateway的GET测试事件触发函数,查看返回结果和CloudWatch日志有没有报错,先确认Lambda本身运行正常,再排查API Gateway的配置问题。
内容的提问来源于stack exchange,提问作者INDRA PATHAK
相关产品推荐
相关产品推荐

