【问题标题】:How to pass a request type to lambda from API gateway?如何从 API 网关将请求类型传递给 lambda?
【发布时间】:2019-03-17 23:40:38
【问题描述】:

目前我有一个通过 API 网关工作的 lambda。但它只是硬编码为获取数据。我想通过网关和 lambda 将一些数据发布到 RDS。我想在同一个 lambda 中执行此操作,并在其中使用一些条件块或 switch 语句。

有没有办法告诉 lambda 请求类型是什么(GET/POST 等),然后是负载,以便 lambda 正确路由并只执行函数的特定部分?

类似:

    exports.handler = (event, context, callback) => {
        context.callbackWaitsForEmptyEventLoop = false
        pool.getConnection(function(err, connection) {
          if (err) callback(err)

          if (request === GET && payload === exercises) {
             connection.query('SELECT * FROM exercises', function (error, results, fields) {
          } else if (request === POST && payload === workouts){
         // do some INSERT INTO sql statement
}


            connection.release();

            if (error) callback(error)
            else callback(null, results)

          });
        })
    }

【问题讨论】:

    标签: javascript node.js amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    一开始这似乎是个坏主意。您需要将 lambda 函数附加到 API 网关中的特定资源(POST、GET 方法)。当 GET 请求到达您的 API Gateway 时,API Gateway 会执行与该特定资源关联的 lambda 函数,POST 请求也是如此。因此,您不需要在 lambda 函数内部处理路由,因为它由 API Gateway 处理。您只需将正确的 lambda 函数附加到 API 网关中的正确资源即可。

    您可能需要此类功能的唯一原因是您试图将相同的 lambda 函数附加到多个资源,这不仅仅是一个原因,这是一个坏主意。这样的功能会比必要的更复杂(更难维护和调试),并且运行时间会更长(尽管在这种情况下可能不会太多),这将导致成本增加。

    所以解决方案是简单地创建一个处理 GET 请求的函数和一个处理 POST 请求的函数。

    考虑到payload,可以通过event参数访问。

    【讨论】:

    • 所以你基本上是说我需要为每种不同的请求类型使用单独的 lambda?
    • @RedBaron 根据最佳实践,是的。
    【解决方案2】:

    当您使用相同的 Lambda 连接每个资源方法时,Lambda proxy integration 绝对可以做到这一点:

    exports.handler = async (event) => {
        if ('POST' === event.httpMethod) {
            ...
        }
        if ('GET' === event.httpMethod) {
            ...
        }
    }
    

    当您还没有足够的知识如何将您的领域切割成功能(有时称为 nanoservices,作为微服务的构建块)时,这可能对一开始没问题,但通常会考虑由于可维护性而成为糟糕的设计 - 您的服务做得太多,代码变得过于有条件,因此很复杂。

    您可以从一个 Lambda 开始,在找到域边界后,将逻辑分成独立的组件,每个 API 资源一个,按其职责。

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 2020-11-05
      • 1970-01-01
      • 2019-03-18
      • 2021-03-16
      • 2020-09-18
      • 2020-05-31
      • 2021-05-27
      • 2020-04-26
      相关资源
      最近更新 更多