serverless-express icon indicating copy to clipboard operation
serverless-express copied to clipboard

Route path routes to null when rawPath is empty from API Gateway

Open kueckermann opened this issue 3 years ago • 0 comments

When using API Gateway (v2 payload) with a custom domain and base path mapping, for example api.example.com/v1, where api.example.com is the custom domain and v1 is the base path, API Gateway will route the request to the lambda regardless of a trailing forward slash. For example api.example.com/v1 or api.example.com/v1/ will route to the lambda.

The issue with this is that when the trailing forward slash is missing, the lambda payload will contain a raw path that is empty:

{
  version: '2.0',
  routeKey: '$default',
  rawPath: '',
  rawQueryString: ''
  ...
}

When using an express app with the serverless-express library, this results in a 404 response from the express app and a body containing the text Cannot GET null.

I'm not sure if this is an issue with express or serverless-express, but a workaround could be to place a default value in function getRequestValuesFromApiGatewayEvent({ event }) to prevent this from happening. For example, line 13 of event-sources/aws/api-gateway-v2.js could be changed from:

  const requestPathOrRawPath = requestPath || rawPath

to:

  const requestPathOrRawPath = requestPath || rawPath || '/'

It sees most logical that both api.example.com/v1 or api.example.com/v1/ route to the same location. In my case I have a health check route at '/':

app.all('/', (req: Request, res: Response) => {
  res.send({
    // Health check stats
  })
})

kueckermann avatar Dec 29 '22 08:12 kueckermann