我的带有 lambda 函数的 AWS API Gateway REST API 返回 Null,如何解决这个问题?

Posted

技术标签:

【中文标题】我的带有 lambda 函数的 AWS API Gateway REST API 返回 Null,如何解决这个问题?【英文标题】:My AWS API Gateway REST API with lambda function is returning Null, How to resolve this? 【发布时间】:2021-11-03 05:48:36 【问题描述】:

我是 AWS 的新手,正在尝试学习如何使用 Lambda 函数和 Dynamo DB 制作 REST API(非代理集成)。我已经启用了 cors,在资源中配置了 REST API 的方法请求和方法响应。我的 Lambda 函数代码似乎是正确的,但是当我从 POSTMAN 或响应应用程序调用此 API 时,它返回 NULL。

LAMBDA 函数:-

var AWS = require('aws-sdk');
const ddb = new AWS.DynamoDB.DocumentClient(region : 'us-west-2');

exports.handler = async (event) => 
       if(event.httpMethod==='GET')
       
        console.log("GET method if is called")
         return readDatabase(event);
       
;

function readDatabase(event)

 try
 console.log("inside readDatabase function")
   let params = 
       TableName: 'devicedata',
       
           ;
  return ddb.scan(params).promise()
   .then(data=>
    const response =
     statusCode: 200,
         body : JSON.stringify(
           "deviceData" : data
         )
    
   return response;
  );
 
  catch (e) 
        let response = 
            statusCode: 400,
            body: JSON.stringify(
                "Message": "Error in Read From Database function",
                "Details": e
            )
        
        return response;
    

REST API 资源:-

集成响应标头映射:-

方法响应配置:-

启用 Cors 配置:-

这些是配置,但它发送输出为 - “null”。

MY Lambd 函数中的触发器:-

【问题讨论】:

【参考方案1】:

首先,您必须检查您的 lambda 函数是否正常工作:您可以使用 lambda 中的预定义测试,如下所示:

然后如果 lambda 工作并且它仍然返回 NULL,请尝试检查 lambda 函数之前和之后的集成请求和响应设置。

【讨论】:

【参考方案2】:

我有类似的东西,我的解决方案最终是在我的 lambda 函数中,我需要准确指定正在使用的 httpMethod 和生成的响应,所以您可能会注意到,在您的事件中,httpMethod 是“OPTIONS”,其中相反,您可能意味着它是“POST”或“PUT”,以便在 event.handler 中调用我的 lambda 函数之前处理这个问题,我做了一个像这样的可选条件;

if(event.requestContext.httpMethod === 'OPTIONS')
        const response = 
            statusCode: 200,
            headers: 
                "Access-Control-Allow-Origin": "*",
                "Access-Control-Allow-Headers": "*",
                "Access-Control-Allow-Methods": "*",
                "Content-Type": "*/*",
                "Accept": "*/*"
            ,
        
        return response
     
let functionResponse = await function(arg2, arg1);
    const response = 
        statusCode: 200,
        headers: 
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Headers": "*",
            "Access-Control-Allow-Methods": "*",
            "Content-Type": "*/*",
            "Accept": "*/*"
        ,
        body: JSON.stringify(functionResponse),
    ;
    return response;
;

【讨论】:

以上是关于我的带有 lambda 函数的 AWS API Gateway REST API 返回 Null,如何解决这个问题?的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS Lambda 中访问 GET 参数

AWS Lambda 和 API Gateway 响应集成问题

是否可以使用 AWS API 为 Lambda 函数设置 AWS API Gateway 端点?

带有 Cognito 的 AWS Lambda API 网关 - 如何使用 IdentityId 访问和更新 UserPool 属性?

AWS SAM/Cloudformation 配置 API Gateway 指向 lambda 函数版本

带有putrecord的lambda函数的AWS firehose delievery流