Amazon web services 将CORS头从AWS Lambda发送到网关会阻止我的Lambda函数正确执行

Amazon web services 将CORS头从AWS Lambda发送到网关会阻止我的Lambda函数正确执行,amazon-web-services,aws-lambda,cors,aws-api-gateway,Amazon Web Services,Aws Lambda,Cors,Aws Api Gateway,我正在慢慢地向使用或理解AWS的基本能力迈进。我设置了一个网关API,将字符串发布到(Node 10.x)Lambda函数,然后将该函数发送到Dynamo表。我在尝试从网页javascript进行API调用时遇到了CORS问题,发现它与Lambda函数中处理程序中的CORS有关。以下是我现在拥有的: const AWS = require('aws-sdk'); const db = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});

我正在慢慢地向使用或理解AWS的基本能力迈进。我设置了一个网关API,将字符串发布到(Node 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();
    };

我从AWSAPI页面运行测试,只是将其字符串发送到Post like

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

当我发表评论时

    context.succeed(response);
我的函数将数据添加到Dynamo表中,但在网关日志中不显示CORS头,这意味着它们未被接收,如果我在网页上尝试,网页将错误地告诉我缺少Access Control Allow Origin头。如果我保留该代码段,网关日志将显示正确的CORS头,网页控制台将越过Access Control Allow Origin错误移到另一个错误上(CORS头中缺少标记“content type”,但这对我将来来说是个问题),但数据不会传递到Dynamo表上,即使它上面的console.log语句正确触发

我不知道这是怎么发生的,也不知道为什么会发生,所以我希望大家能深入了解可能的错误

编辑:这是我的网页

//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);



}


欢迎使用StackOverflow,所以您的问题是您需要像这样使用回调

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

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调用格式错误,将生成异常


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

我将对此进行研究,谢谢!如果我可以问一下,我的迪纳摩电话怎么了?当我在Lambda中或通过Gateway测试函数时(它不会抛出CORS错误),Lambda调用会工作,数据会添加到我的Dynamo表中。哦,很抱歉,这取决于event.body的构造公平地说,实际上,您只想从客户端而不是DDB结构获取数据。但是,请尝试一下,记住返回回调(…)是执行的结束其实,;这是我的错,因为我没有注意到DDB位,你的发送基本上是发送项目,然后有DDB表等API端。否则,前端用户可以指定他们插入到哪个表中,而不管哪个端点是坏的jujuju-但是让我们先解决CORS问题!因此,我将您的编辑复制/粘贴到我的Lambda函数中,当我通过API进行测试时,我得到并将该项添加到我的表中。然而,从我的网页上运行它仍然可以让我了解CORS。我的网页javascript可能遗漏了什么吗?你的网页也是HTTPS吗?你能用你当前的代码更新你的问题吗?从外观上看,你正在使用chrome。思考的脸-如果你愿意,我可以和你聊一聊来解决这个问题?