AWS Lambda,测试按钮执行哪种类型的请求?

时间:2018-10-10 18:42:36

标签: json amazon-web-services post aws-lambda

AWS Lambda新手在这里。 我正在使用AWS Lambda函数进行一些测试,但有些事情对我来说不正确。 鉴于此lambda函数:

exports.handler = async (event, context, callback) => {
    var response = {
        statusCode: 200,
        headers: {'Content-Type': 'application/json'},
        response: event.talk
    };
    callback(null, response);
};

当我按test button的内容时(here是屏幕截图):

{
   "talk": "Hello World"
}

我收到此回复(here是屏幕截图):

{
  "statusCode": 200,
  "headers": {
    "Content-Type": "application/json"
},
  "response": "Hello World"
}

但是当我发出POST请求(我添加了一个开放的API网关,看到它here)时,它只会返回空数据,有时还会返回内部服务器错误(here是屏幕截图):

no data

如果我将Lambda函数修改为JSON解析正文,它将起作用

exports.handler = async (event, context, callback) => {
    var body = JSON.parse(event.body);
    var talk = body.talk;
    var response = {
        statusCode: 200,
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify(talk)
    };
    callback(null, response);
};

这是怎么回事?为什么测试按钮与POST请求的工作方式不同?我希望两者都能正常工作,尤其是测试,因为我想“调试”“无服务器”

2 个答案:

答案 0 :(得分:1)

当您调用 AWS lambda 处理请求时,您将在请求中传递什么。

  

因此,当您需要在event中使用正文传递数据时,只需在body对象中添加event参数。

{
 "body": "{\"talk\":\"Hello World\"}"
}

注意:

  

当您从POST调用lambda时,请求事件中的对象包含body

答案 1 :(得分:0)

测试按钮将仅通过提供的事件来运行您的lambda,但是当您通过API网关代理运行它时,您会获得不同格式的事件。至于为什么解析event.body时它起作用,是因为event.body将包含通过API发送的消息。

最好的做法是:

console.log(JSON.stringify(event));

并查看传入的事件格式。