如何从API网关将请求类型传递给lambda?

时间:2019-03-17 13:50:08

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

目前,我在API网关上有一个lambda。但是它只是硬编码为GET数据。我想通过网关和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)

          });
        })
    }

2 个答案:

答案 0 :(得分:0)

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

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

因此,解决方案只是创建一个将处理GET请求的函数和一个将处理POST请求的函数。

考虑有效载荷,您可以通过event参数对其进行访问。

答案 1 :(得分:0)

当您将每个资源方法与同一个Lambda连接在一起时,Lambda proxy integration绝对可以做到这一点:

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

开始时可能还不错,当您还没有足够的知识如何将域划分为功能时(有时称为 nanoservices ,作为微服务的构建块),但通常认为出于可维护性的考虑,这是一个糟糕的设计-您的服务工作量太大,代码变得有条件,因此很复杂。

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