node.js - 如何解析 lambda 中的事件参数?

标签 node.js lambda aws-lambda

我在 lambda 代理集成中使用 Node.js 8.10。 我的目标很简单。

  1. 将 json 数据发送到 lambda 函数
  2. 使用json数据查询rds并从rds中检索数据
  3. 从 rds 数据返回 lambda 中包含 json 数据的响应。

但我在步骤 1 中遇到了问题。我试图找出答案,并向 AWS 支持中心询问。这没有帮助。请帮助我。

我的测试 json 数据是:

{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

我的代码很简单,但有一个问题:

exports.handler = async (event) => {
    var body = JSON.parse(event)//<--this is a problem

    let responseBody = {
        message: "hello",
        key1: body.key1
    };
    const response = {
        statusCode: 200,
        headers : {"Access-Control-Allow-Origin" : "*"},
        body: JSON.stringify(responseBody)
    };
    return response;
};

我在第二行遇到了这个错误。

{"errorMessage":"Unexpected token o in JSON at position 1","errorType":"SyntaxError","stackTrace":["JSON.parse (<anonymous>)","exports.handler (/var/task/index.js:2:21)"]}

所以我像这样更改了第二行代码。

var body = JSON.parse(JSON.stringify(event))

然后我得到了很好的回应。我认为效果很好。

{
  "statusCode": 200,
  "headers": {
    "Access-Control-Allow-Origin": "*"
  },
  "body": "{\"message\":\"hello\",\"key1\":\"value1\"}"
}

但我确实用 postman 发送了相同的 json 数据。但我只得到这个。

{ “消息”:“你好” }

没有“key1”。所以我添加了console.log,然后检查了cloudwatch中的日志。

{ message: 'hello', key1: undefined }

我可以看到 aws 编辑器日志很好,但是当我使用 postman 发送数据时。 lambda 无法解析我的 json 数据。这意味着 lambda 无法解析事件参数。

我的问题是: 1.当我尝试像这样解析时

var body = JSON.parse(event)"

为什么 lambda 编辑器会出现错误?有什么不对?这是 super 简单且非常常见的代码。

  • 如何解析我的 json 数据并返回正确的值而不是未定义的。我期待这个回应

    { message: '你好', key1: 'value1' }

  • 我已经尝试解决这个问题三天了。但我真的不知道。请帮帮我。

    最佳答案

    来自 API Gateway 的正文是字符串化的 JSON,因此您需要对其进行解析,然后访问所需的属性。

    'use strict';
    
    exports.handler = async (event) => {
      let responseBody = {
        message: "hello",
        key1: JSON.parse(event.body).key1
      };
      const response = {
        statusCode: 200,
        headers: { "Access-Control-Allow-Origin": "*" },
        body: JSON.stringify(responseBody)
      };
      return response;
    
    };
    

    这样就可以了。

    关于node.js - 如何解析 lambda 中的事件参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54988235/

    相关文章:

    amazon-web-services - 没有为方法定义集成 - 选择将部署 API 的阶段

    node.js - Mongoose 部分搜索

    java - 使用 Java Streams 对 concat 字符串执行算术运算

    c++ - 为什么 "std::async"没有按预期工作?

    aws-lambda - 在localstack中创建API网关

    amazon-web-services - 如何使用 SAM 通过 API Gateway 配置异步 lambda 调用?

    javascript - 我可以并行运行多少个 NodeJS Express 服务器?

    node.js - 使用 Mocha 测试 NightmareJS 代码失败

    javascript - 避免循环访问由 mongodb 和 express 生成的 URL

    java - 为什么 `break label` 不能在 lambda 表达式中使用?有什么解决办法吗?