Search code examples
node.jsaws-lambdaaws-api-gatewayserverless-framework

Configuring Serverless to handle required path parameters


I'm new to serverless and writing my first service. It is built for the AWS API gateway and node.js lambda functions. Consider this as my serverless.yaml file:

service: applicationCatalog
frameworkVersion: '2'
provider:
  name: aws
  runtime: nodejs12.x
functions:
  listShirts:
    handler: handler.listShirts
    events:
    - httpApi: GET /
  createShirt:
    handler: handler.createShirt
    events:
    - httpApi: POST /
  getShirt:
    handler: handler.getShirt
    events:
    - httpApi:
        method: GET
        path: "/{shirtId}"
        request:
          parameters:
            paths:
              shirtId: true
  deleteShirt:
    handler: handler.deleteShirt
    events:
    - httpApi:
        method: DELETE
        path: "/{shirtId}"
        request:
          parameters:
            paths:
              shirtId: true
resources: {}

The functions listShirts, createShirt, and getShirt all work as I expected, and deleteShirt works too when a ShirtId is passed. The issue is when I don't pass the ShirtId on a delete. Assuming my service url is "https://shirts.mywardrobeapi.com". I'd expect this request:

DELETE https://shirts.mywardrobeapi.com

to trigger an error response from the API gateway. Instead, the deleteShirt function is invoked. Of course I could handle this simple check inside the function, but I thought that's what the { "shirtId" : true } setting in the serverless.yaml file was for. How can I get this setting to treat shirtId as required and not invoke the function when it's not provided? If I can't, what is this purpose of this setting?


Solution

  • I would suggest using Middy and validator middleware for handling required parameters. Yep, the disadvantage is that your lambda is triggered all the time. But also you obtain

    • the flexibility of keeping handling required params in the code
    • clear logging if the parameters were wrong
    • you may also validate outgoing responses
    • keeps you serverless.yaml cleaner

    We prefer the middy more than precise configure of Gateway API.