使用代理集成时,API网关和Lambda仅会**发生CORS错误

时间:2018-10-05 18:02:04

标签: amazon-web-services cors aws-lambda amazon-dynamodb aws-api-gateway

我正在尝试使用Lambda根据API网关的发布请求将项目添加到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网关上启用了CORS超过30次,并且还通过在响应中添加标头进行了双重检查。但是无论我做什么,都会收到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']

1 个答案:

答案 0 :(得分:0)

您的问题在于代码流。基本上,您不是在等待回叫执行之前就等待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); 

});