A lib to easily make routes in lambdas using the Serverless Framework
Sometimes there is no need of having multiple lambdas, for example, let's suppose we have one lambda to get the user email and other lambda to get the user phone number. In this case, we could have only one lambda with two endpoints, /email
and /phone
. Doing this way, you will have a much more organized AWS and it will be possible to separate lambdas by domain.
To make this, you would need to create something to handle the requests incoming, by checking the path and method and then, if matching, run a certain function.
With this lib, you can easily do this :)
- Use the serverless framework
- Typescript project
You can find how to this here
hello@world:~$ yarn add slseasyrouting
or
hello@world:~$ npm i slseasyrouting
First, you'll need to enable decorators in your typescript project. You can achieve that by adding this line under compilerOptions in your tsconfig.json:
"experimentalDecorators": true
Now you have to configure your serverless to accept any request to any endpoint. Here is my serverless.yml function config:
functions: {
main: {
handler: hello.handler,
events: [
{
http: {
method: 'ANY',
path: '/',
},
},
{
http: {
method: 'ANY',
path: '{proxy+}',
},
},
],
},
},
After this, you'll need to create a routes file, I recommend something like routes.ts
, inside it, create a class called Routes and add the @Route
decorator, inside the class, add a constructor containing the event and then the methods with the desired decorator, check the example:
import { getDate, hello } from "./services/hello.service";
import { Route, Post, Get } from "slseasyrouting";
@Route
export class Routes {
constructor(private readonly event: any) {}
@Post("/")
async helloRoute(event) {
return await hello(event.body.name);
}
@Get("/")
async getTodaysDate() {
return await getDate();
}
}
Then, at your handler.ts
file, add return new Routes(event)
, it will look like this:
import { middyfy } from '@libs/lambda';
import { Routes } from './routes';
const handler = async (event) => {
console.log(event);
return new Routes(event);
};
export const main = middyfy(handler);
Inside the decorator, you can pass the desired endpoint, for example, @Get('/users/email')
.
This lib contains some responses too in case you want to use, for example, if you want to throw a 401, you can use return UnAuthorized()
. You can pass a custom message too by providing it inside the function parameters, for example: return UnAuthorized('Get out!')
.
As said before, this lib contains some functions that you can call for responses. At the moment we have:
function | status code |
---|---|
UnAuthorized | 401 |
NotFound | 404 |
Gone | 410 |
BadRequest | 400 |
ServiceUnavailable | 503 |
Success | 200 |