当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda和API网关NodeJs的畸形Lambda代理响应

公良弘毅
2023-03-14

我正在使用API网关和AWS Lambda与另一个AWS Lambda函数进行交换。

我应该在初次请求插入数据后发送响应,无论是成功还是失败。我正在使用API网关的特定路由。

结构是这样的:

现在我不断得到502畸形Lambda代理响应,这在我的API测试日志中:

Tue Sep 22 06:56:10 UTC 2020 : Endpoint response headers: {Date=Tue, 22 Sep 2020 06:56:10 GMT, Content-Type=application/json, Content-Length=4, Connection=keep-alive, x-amzn-RequestId=xxxxxxxx, x-amzn-Remapped-Content-Length=0, X-Amz-Executed-Version=$LATEST, X-Amzn-Trace-Id=xxxxxxx}
Tue Sep 22 06:56:10 UTC 2020 : Endpoint response body before transformations: null
Tue Sep 22 06:56:10 UTC 2020 : Execution failed due to configuration error: Malformed Lambda proxy response
Tue Sep 22 06:56:10 UTC 2020 : Method completed with status: 502

问题是我返回了一个真实的回应。如前所述,我将API网关与lambda API一起使用,这是一个处理API网关路由(如Express)的包,这就是我正在做的:

api.post('/database-manager/create-request', async (lambdaRequest, lambdaResponse, callback) => {
    await provideConnectionInfo()
    let connection = mysql.createConnection({
            host: mySQLHost,
            user: mySQLUser,
            password: mySQLPassword,
            database: mySQLDatabase
        }
    )
    requestNb = lambdaRequest.headers["request-id"]
    pipelineId = lambdaRequest.headers["pipeline-id"]

    connection.connect(function (err) {
            if (err) throw err
            let query = "INSERT INTO ec2_request(request_id, pipeline_id) VALUES (?,?)"
            connection.query(query,[requestNb,pipelineId], function (err, result) {
                    if (err) {
                        connection.end()
                        console.log("insertion did not work : " + err)
                        let response = {
                            "statusCode": 404,
                            "headers": {},
                            "isBase64Encoded": false,
                            "body": JSON.stringify({message: "Record not inserted"})
                        }
                         return response
                        )

                    } else {
                        connection.end()
                        console.log("1 record inserted")
                        let response = {
                            "statusCode": 200,
                            "headers": {},
                            "isBase64Encoded": false,
                            "body": JSON.stringify({message: "tired of this bs"})
                        }
                        return response

                    }
                }
            )
        }
    )

})

最糟糕的是我的日志没有显示任何错误:

1600758637213   START RequestId: f804577b-c0a2-4d11-8822-52363fa41c7d Version: $LATEST
1600758639189   2020-09-22T07:10:39.188Z    f804577b-c0a2-4d11-8822-52363fa41c7d    INFO    1 record inserted
1600758639348   END RequestId: f804577b-c0a2-4d11-8822-52363fa41c7d
1600758639348   REPORT RequestId: f804577b-c0a2-4d11-8822-52363fa41c7d  Duration: 2134.45 ms    Billed Duration: 2200 ms    Memory Size: 128 MB Max Memory Used: 94 MB  Init Duration: 555.23 ms

如果有人看到我可能犯了错误,我会给他们买个甜甜圈。

想知道是状态错了...

提前多谢了,

车费

共有1个答案

蒋乐意
2023-03-14

你正在使用回调函数内部async没有等待。

这里有几个选择

>

保持异步并将查询功能包装为promise并使用等待

api.post('/database-manager/create-request', async (lambdaRequest, lambdaResponse, callback) => {
 await provideConnectionInfo()
 let connection = mysql.createConnection({
         host: mySQLHost,
         user: mySQLUser,
         password: mySQLPassword,
         database: mySQLDatabase
     }
 )
 requestNb = lambdaRequest.headers["request-id"]
 pipelineId = lambdaRequest.headers["pipeline-id"]


 const res = await new Promise(function(resolve, reject) {
     connection.connect();
     let query = "INSERT INTO ec2_request(request_id, pipeline_id) VALUES (?,?)"

     connection.query(query,[requestNb,pipelineId], function (err, result) {
         if (err) {
             connection.end()
             console.log("insertion did not work : " + err)
             let response = {
                 "statusCode": 404,
                 "headers": {},
                 "isBase64Encoded": false,
                 "body": JSON.stringify({message: "Record not inserted"})
             }
             reject(response)

         } else {
             connection.end()
             console.log("1 record inserted")
             let response = {
                 "statusCode": 200,
                 "headers": {},
                 "isBase64Encoded": false,
                 "body": JSON.stringify({message: "tired of this bs"})
             }
             resolve(response)

         }
     })
 });

 return res;   
})

注意:代码尚未测试。

 类似资料:
  • 在我的项目中,我创建了一个py函数,用于检查和修改我的谷歌日历,如下所示: 当我在lambda上测试它时,一切都完成了,但是当我从lambda创建API时: 并对其进行测试,结果是: 2017年12月20日星期三13:35:58 UTC:由于配置错误,执行失败:Lambda代理响应格式错误2017年12月20日星期三13:35:58 UTC:方法已完成,状态为:502 提前谢谢

  • 经过大量的谷歌搜索和几个小时的尝试和错误,我找不到为什么我得到这个错误消息: 由于配置错误,执行失败:错误的Lambda代理响应 当我使用testlambda功能运行lambda时,它工作得很好。对类似问题的回答表明,lambda的响应需要满足此格式: 下面是我使用的lambda(遵循此格式): 我不认为这是一个配置问题,我正在使用Terraform来构建基础设施,如果这有什么帮助的话。提前谢谢!

  • 问题内容: 我正在尝试使用AWS Lambda建立一个hello world示例,并通过api网关为其提供服务。我单击了“创建Lambda函数”,这将设置api通道并选择了Blank Function选项。我添加了在AWS网关入门指南中找到的lambda函数: 问题是,当我向它发出GET请求时,它返回了502响应。并且日志显示“由于配置错误,执行失败:Lambda代理响应格式错误”。 问题答案:

  • 我试图用AWS lambda建立一个hello world示例,并通过api网关为其服务。我点击了“创建一个Lambda函数”,它设置了api网关,并选择了空白函数选项。我添加了在AWS网关入门指南上找到的lambda函数: 问题是,当我向它发出GET请求时,它返回502响应。日志上写着“由于配置错误执行失败:Lambda代理响应不正确”。

  • 我正在尝试使用AWS lambda设置一个hello world示例并通过api网关提供它。我单击了“创建Lambda函数”,它设置了api网关并选择了空白函数选项。我添加了在AWS网关上找到的lambda函数入门指南: 问题是,当我向它发出GET请求时,它会返回502响应{“message”:“Internal server error”}。日志显示“由于配置错误,执行失败:Lambda代理响应

  • 我用无服务器创建了一个lambda函数。我用lambda控制台测试了lambda函数,它工作得很好。但是,在转换之前,我得到了endpoint响应体:null和执行失败,原因是配置错误:当我试图为该函数调用APIendpoint时,错误的Lambda代理响应。 并且调用了查询字符串参数的endpoint:。 我不知道为什么我的函数已经以这里的格式返回了响应,但仍然得到了格式错误的Lambda代理响