首页 > 解决方案 > 无服务器 - 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}) 已经有一个可变路径部分 - 只允许一个

我对另一个项目进行了类似的设置,并且效果很好。为什么我现在收到此错误?

标签: aws-lambdaserverless-framework

解决方案


我还不知道为什么会出现这个问题,但是你不能有两个 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 函数将运行的容器将更频繁地被命中。


推荐阅读