【问题标题】:Sending CORS headers from AWS Lambda to Gateway prevents my Lambda function from executing correctly将 CORS 标头从 AWS Lambda 发送到网关会阻止我的 Lambda 函数正确执行
【发布时间】:2020-03-10 13:38:06
【问题描述】:

我正在慢慢地朝着使用或理解 AWS 的基本能力迈进。我设置了一个网关 API,以将字符串发布到(节点 10.x)Lambda 函数,然后将其发送到 Dynamo 表。我在尝试从网页 javascript 进行 API 调用时遇到了 CORS 问题,并发现它与 Lambda 函数的处理程序中的 CORS 有关。这是我现在拥有的:


const AWS = require('aws-sdk');
const db = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});
exports.handler = async function(event, context) {

    var responseCode = 200;

    var response = {
        statusCode: responseCode,
        headers: {
            "Access-Control-Allow-Origin": "*"

        },
        body: JSON.stringify(event)
    };

    context.succeed(response);

    console.log("Made it past context succeed");
    var characterData = JSON.parse(event.body);

    return await db.put(characterData).promise();
    };

我从 AWS API 页面运行测试,只是将它的字符串发送到 Post 像

{
    "TableName" : "characterTable",
    "Item" : {
      "userID" : "123",
      "characterName" : "Alan",
      "race" : "human"
    }
  }

当我注释掉

    context.succeed(response);

我的函数将数据添加到 Dynamo 表中,但未在网关日志中显示 CORS 标头,这意味着未收到它们,如果我在网页上尝试,网页将错误地告诉我我正在缺少 Access-Control-Allow-Origin 标头。如果我保留该 sn-p,网关日志会显示正确的 CORS 标头,并且网页控制台会从 Access-Control-Allow-Origin 错误移至另一个错误(CORS 标头中缺少令牌“内容类型”,但那是将来对我来说是个问题)但数据不会传递到 Dynamo 表中,即使它上面的 console.log 语句正确触发。

我不确定这是如何发生的或为什么会发生,因此我希望能深入了解可能出现的问题!

编辑:这是我的网页 JS

//Default AWS sdk object
var lambda = new AWS.Lambda();

//api sdk stuff
var apigClient = apigClientFactory.newClient({
  apiKey: 'iHadMyAPIKeyHere ' //placeholder for my actual API Key
});

function makeJSON(){
  var userID = "";
  var name = document.forms["characterForm"]["characterName"].value;

  var race = document.forms["characterForm"]["race"].value;
  var playerClass = document.forms["characterForm"]["class"].value;
  var strength = document.forms["characterForm"]["strength"].value;
  var dexterity = document.forms["characterForm"]["dexterity"].value;
  var constitution = document.forms["characterForm"]["constitution"].value;
  var intelligence = document.forms["characterForm"]["intelligence"].value;
  var wisdom = document.forms["characterForm"]["wisdom"].value;
  var charisma = document.forms["characterForm"]["charisma"].value;



  characterSheetObj = {"userID": userID, "name": name, "race": race, "class": playerClass, "strength": strength, "dexterity": dexterity, "constitution": constitution, "intelligence": intelligence, "wisdom": wisdom, "charisma": charisma}
  characterSheetJSON = JSON.stringify(characterSheetObj);

  alert(characterSheetJSON);

  var params = {

  }
  var body = {
    "TableName" : "characterTable",
    "Item" : {
      "userID" : userID,
      "name" : name,
      "race" : race
    }
  }

  var additionalParams = {

  }

  apigClient.myresourcePost(null, body);



}

【问题讨论】:

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


    【解决方案1】:

    欢迎来到 StackOverflow,所以你的问题是你需要像这样使用回调......

    callback 作为函数的最终结果被调用,您希望返回 callback(....) 以确保您的测试在以后正常工作。

    const AWS = require('aws-sdk');
    const db = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});
    exports.handler = async function(event, context, callback) {
    
        var responseCode = 200;
    
        var response = {
            statusCode: responseCode,
            headers: {
                "Access-Control-Allow-Origin": "*"
    
            },
            body: JSON.stringify(event)
        };
    
        console.log("Made it past context succeed");
        var characterData = JSON.parse(event.body);
    
        await db.put(characterData).promise();
    
        return callback(null, response)
    
    };
    
    

    注意您的 dynamo DB 调用格式错误,会产生异常。

    上下文成功是旧方法,请参阅this 答案以获取有关返回正确 http 响应的更多信息。

    【讨论】:

    • 我会调查的,谢谢!如果我可能会问,我的 Dynamo 呼叫有什么问题?当我在 Lambda 中或通过 Gateway 测试函数时(它不会引发 CORS 错误),Lambda 调用有效,并且数据被添加到我的 Dynamo 表中。
    • 抱歉,公平地说,这取决于您的 event.body 的构造,实际上您只想从客户端获取 DATA 而不是 DDB 结构。但是尝试一下,记住 return callback(...) 是执行的结束! - 实际上那是我的错,因为我没有注意到你发送的 DDB 位
    • 基本上发送ITEM,然后有DDB表等API端。否则前端用户可以指定他们插入哪个表,而不管端点是坏的 juju - 但让我们先解决 CORS 问题!
    • 所以我将您的编辑复制/粘贴到我的 Lambda 函数中,当我通过 API 进行测试时,我得到了 the appropriate headers in the log 并将项目添加到我的表中。但是,从我的网页上运行它仍然会给我this error 关于 CORS 的信息。我的网页 javascript 中是否缺少某些内容?
    • Err 你的网页也是 HTTPS 吗?你能用你当前的代码更新你的问题吗?从外观上看,您使用的是 chrome。 思考的脸 - 如果你愿意,我可以和你聊天来解决这个问题?
    猜你喜欢
    • 2017-09-05
    • 2018-01-15
    • 2019-05-10
    • 1970-01-01
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2020-11-11
    相关资源
    最近更新 更多