aws-lambda - 无服务器 - ApiGatewayResourcePostsUseridVar - 此资源的同级 ({postId}) 已经有一个可变路径部分 - 只允许一个
问题描述
在我的 serverless.yml 文件中,我为我的 lambda 函数定义了几个路径:
GetAllPublicPosts:
handler: src/lambda/http/getAllPublicPosts.handler
events:
- http:
method: get
path: posts
...
GetAllUserPosts:
handler: src/lambda/http/getAllUserPosts.handler
events:
- http:
method: get
path: posts/{userId}
...
CreatePost:
handler: src/lambda/http/createPost.handler
events:
- http:
method: post
path: posts
...
UpdatePost:
handler: src/lambda/http/updatePost.handler
events:
- http:
method: patch
path: posts/{postId}
...
DeletePost:
handler: src/lambda/http/deletePost.handler
events:
- http:
method: delete
path: posts/{postId}
...
GenerateUploadUrl:
handler: src/lambda/http/generateUploadUrl.handler
events:
- http:
method: post
path: posts/{postId}/attachment
当我尝试像这样部署它时,我收到一个错误:
发生错误:ApiGatewayResourcePostsUseridVar - 此资源的同级 ({postId}) 已经有一个可变路径部分 - 只允许一个
我对另一个项目进行了类似的设置,并且效果很好。为什么我现在收到此错误?
解决方案
我还不知道为什么会出现这个问题,但是你不能有两个 lambdas 指向同一条路径。通过示例更好地解释:
UpdatePost:
handler: src/lambda/http/updatePost.handler
events:
- http:
method: patch
path: posts/{postId} # <- the 'posts/' here
...
DeletePost:
handler: src/lambda/http/deletePost.handler
events:
- http:
method: delete
path: posts/{postId} # <- and the 'posts/' here
如果您将它们更改为其他单词或端点,它将起作用,例如:
UpdatePost:
handler: src/lambda/http/updatePost.handler
events:
- http:
method: patch
path: post/{postId} # <- changed from 'posts/' to 'post/'
...
DeletePost:
handler: src/lambda/http/deletePost.handler
events:
- http:
method: delete
path: posts/{postId}
但这显然是不可行的,而且可读性不好(从用户的角度来看所有端点)。在这种情况下,我建议将许多方法分组到一个处理程序中,例如 CreatePost、UpdatePost、DeletePost 在一个处理程序中,然后在该处理程序内部通过例如开关或任何。像这样的东西:
PostHandler:
handler: src/lambda/http/post-handler.handler
events:
- http:
method: patch
path: posts/{postId}
- http:
method: delete
path: posts/{postId}
您可以从 lambda 函数处理程序的事件对象中获取方法类型。这是修复 lambda 冷启动问题,因为 lambda 函数将运行的容器将更频繁地被命中。
推荐阅读
- java - 解析最后修改日期时出现解析错误
- javascript - 如何在 d3.js 中进行文本溢出
- python - 试图在 Python 中访问所有 .txt 文件
- javascript - Moment.js 无法解析字符串到日期
- python - 使用 base 2 python 将十六进制转换为十六进制
- ionic-framework - Ionic API 请求未完成 - 保持待处理状态
- c# - 如何使用已经在 FlowLayoutPanel 内的面板内的控件?
- mysql - 更改订阅 bbpress 论坛的每个 wordpress 用户的电子邮件
- sql - 计算两个日期之间的天数,不包括周末
- swift - 在核心数据中存储经常更改的图像数组的最有效方法