@everestate/serverless-router
Serverless, minimalist, pluggable, universal router.
Installation
npm install @everestate/serverless-router --save
Usage
To use serverless-router
you will need at least one of its plugins.
const Router = require('@everestate/serverless-router');
const { HTTP } = require('@everestate/serverless-router-aws');
cosnt userService = require('../services/userService');
function dispatch(event) {
const router = new Router([HTTP]);
router.http
.post('/users', () =>
userService.createUser(event.body))
.get('/users/:id', () =>
userService.getUserById(event.pathParameters.id))
.patch('/users/:id', () =>
userService.updateUser(event.pathParameters.id, event.body))
.delete('/users/:id', () =>
userService.deleteUser(event.pathParameters.id));
router.mismatch(() => {
const { path, httpMethod } = event;
return Promise.reject(new Error(`Unknown route: ${httpMethod} ${path}`));
});
return router.dispatch(event);
}
function myLambdaHandler(event, context, callback) {
return dispatch(event)
.then(result =>
callback(null, { statusCode: result.code, body: JSON.stringify({ payload: result.payload }) }))
.catch(error =>
callback(null, { statusCode: '500', body: JSON.stringify({ message: error.message }) }));
}
When route is mismatched
By default serverless-router
will throw error
on route mismatch.
It's possible to define a custom mismatch handler, and it would be called with same arguments as dispatch
was called:
router.mismatch((event, context, callback) => {
const { path, httpMethod } = event;
return callback(null, {
statusCode: '404',
body: JSON.stringify({ message: `ServerlessRouter can't find the route ${httpMethod} ${path}` }),
});
});
Middleware
When middleware are set, they will be called before each matched route in order they registered.
Middleware callback is expected to return Promise
and could be defined with use
:
router.use((event, context, callback) => {
const { source } = event;
if (source === 'bad source') {
return Promise.reject(new Error('Bad event source'));
}
return Promise.resolve();
})
Plugins
Check the docs/plugins.md to find out how to implement the new plugin.
License
MIT