目前,我在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)
});
})
}
答案 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资源一个。