使用代理集成时,API 网关和 Lambda 出现 CORS 错误**仅**

Posted

技术标签:

【中文标题】使用代理集成时,API 网关和 Lambda 出现 CORS 错误**仅**【英文标题】:CORS error with API Gateway and Lambda **only** when using Proxy Integration 【发布时间】:2019-03-11 06:48:05 【问题描述】:

我正在尝试根据来自 API Gateway 的发布请求使用 Lambda 将项目添加到 DynamoDB。

这是我的 Lambda 代码的样子:

var AWS = require('aws-sdk');
var dynamoDB = new AWS.DynamoDB();

exports.handler = (event, context, callback) => 
var temp_id = "1";
var temp_ts = Date.now().toString();
var temp_calc = event['params']['calc'];

var params = 
    TableName:"calc-store",
    Item: 
        Id: 
            S: temp_id
        ,
        timestamp: 
            S: temp_ts
        ,
        calc: 
            S: temp_calc
        
    
;
dynamoDB.putItem(params,callback);


const response = 
    statusCode: 200,
    headers: 
        'content-type': 'application/json',
        'Access-Control-Allow-Origin': '*' 
    ,
    body: event['params']['calc']
;

callback(null, response); 
;

这就是我从客户端调用函数的方式

axios.post(apiURL, params:calc:calc)
.then ((res) => 
  console.log(res);
)

我已经在我的 API 网关上启用了 30 多次 CORS,并且我还通过在响应中添加标头进行了仔细检查。但无论我做什么,我都会不断收到 CORS 错误,并且由于某种原因,在我的回复中,我可以看到“Access-Control-Allow-Origin”标头没有被附加。

POST https://egezysuta5.execute-api.us-east-1.amazonaws.com/TEST 502
localhost/:1 Failed to load https://egezysuta5.execute-api.us-east- 
1.amazonaws.com/TEST: No 'Access-Control-Allow-Origin' header is 
present on the requested resource. Origin 'http://localhost:3000' is 
therefore not 
allowed access. The response had HTTP status code 502.
createError.js:17 Uncaught (in promise) Error: Network Error
at createError (createError.js:17)
at XMLHttpRequest.handleError (xhr.js:87)

我尝试不使用 Lambda 代理集成,然后它可以工作,但是,我无法访问我传递的参数。

编辑:花了几个小时在这之后,这就是我将问题归结为的原因。我的客户正在向 OPTIONS 发出成功的飞行前请求。 OPTIONS 已成功返回正确的 CORS 标头,但由于某种原因,这些标头并未传递给我的 POST 请求!

EDIT2:(这并不能解决问题)如果我将响应正文更改为字符串,则没有错误!有问题

event['params]['calc']

【问题讨论】:

与此处的帖子类似,但出现 502 错误:***.com/questions/38987256/… 忽略 cors 问题,这可能是你的 Lambda 出问题了。 我不能忽视一个问题,因为它对我的应用程序的运行至关重要 不,我的意思是当你的函数停止出错时,cors 将正常工作,这是你看到的一条红鲱鱼 - 因为函数永远不会到达那里,所以没有发送 cors 标头。 【参考方案1】:

您的问题在于代码的流程。基本上你不会在回调被执行之前等待 putItem 完成......试试这个......

dynamoDB.putItem(params,(err,data) => 
if(err)

  return callback(err, null)



const response = 
    statusCode: 200,
    headers: 
        'content-type': 'application/json',
        'Access-Control-Allow-Origin': '*' 
    ,

    body: JSON.parse(event.body).calc
;

return callback(null, response); 

);

【讨论】:

我试过这个,但现在我得到一个进程在完成错误之前退出 event['params]['calc'] 我认为不正确,控制台记录您的 event.body

以上是关于使用代理集成时,API 网关和 Lambda 出现 CORS 错误**仅**的主要内容,如果未能解决你的问题,请参考以下文章

使用代理通过 AWS API Gateway 的 Lambda 错误

如何允许API网关代理与POST请求的Cognito Authorizer集成?

如何使用SAM通过API网关配置异步lambda调用?

如何在API网关中为反向代理配置AWS EC2实例

如何使用 AWS API 网关和 Lambda 通过 CORS?

python将查询字符串参数传递给API网关