lambda-router
Advanced tools
Comparing version 2.7.0 to 2.8.0
@@ -7,2 +7,6 @@ # Change Log / Release Notes | ||
## [2.8.0] - 2019-07-02 | ||
### Added | ||
- `beforeRoute` middleware | ||
## [2.7.0] - 2019-06-19 | ||
@@ -9,0 +13,0 @@ ### Added |
{ | ||
"name": "lambda-router", | ||
"version": "2.7.0", | ||
"version": "2.8.0", | ||
"description": "A router to simplify AWS Lambda Functions.", | ||
@@ -55,3 +55,7 @@ "main": "src/index.js", | ||
"prettier": "^1.18.2", | ||
"tap-nirvana": "^1.1.0" | ||
"tap-nirvana": "^1.1.0", | ||
"sinon": "^7.3.2", | ||
"snazzy": "^5.0.0", | ||
"standard": "8.1.0", | ||
"tap-spec": "^4.1.1" | ||
}, | ||
@@ -58,0 +62,0 @@ "prettier": { |
@@ -18,3 +18,3 @@ # Lambda Router | ||
logger: console // uses logger-wrapper. | ||
inluceErrorStack: process.env.stage !== 'prod' | ||
includeErrorStack: process.env.stage !== 'prod' | ||
}) | ||
@@ -48,3 +48,3 @@ | ||
function Router ({ | ||
logger, // logger-wrapper | ||
logger, // logger-wrapper | ||
extractPathParameters = true, // merge proxy path parameters into event.pathParameters | ||
@@ -65,2 +65,3 @@ includeTraceId = true, // include TraceId header | ||
unknown: (event, context, path, method) => {} | ||
beforeRoute: async (event, context, path, method) | ||
} | ||
@@ -75,3 +76,3 @@ ``` | ||
Route's can be registered with any of the http verb methods. | ||
Routes can be registered with any of the http verb methods. | ||
@@ -93,2 +94,27 @@ `router.[get|post|put|delete](routePattern: string, handler: (event, context) => Object|Promise)` | ||
## Middleware | ||
You can use the `beforeRoute` method to define middleware that will run before attempting to match a registered route. This is useful for mutating the incoming event or context, or for running validations at the global level: | ||
```js | ||
function redactAuthToken (event, context, path, method) { | ||
event.headers['Authorization'] = '--redacted' | ||
} | ||
function validateContentType (event, context, path, method) { | ||
if (!event.headers['Content-Type'].includes('application/json')) { | ||
const error = new Error('Content-Type must be JSON') | ||
error.statusCode = 400 | ||
throw error | ||
} | ||
} | ||
// these will both run before any route matching occurs | ||
router.beforeRoute(redactAuthToken) | ||
router.beforeRoute(validateContentType) | ||
router.post('/v1/endpoint', service.create) | ||
router.get('/v1/endpoint/{id}', service.get) | ||
``` | ||
# Custom Response | ||
@@ -162,2 +188,2 @@ | ||
``` | ||
``` |
@@ -39,6 +39,11 @@ 'use strict' | ||
const routes = [] | ||
const add = (method, path, handler) => { | ||
const addRoute = (method, path, handler) => { | ||
routes.push({ method, path, handler }) | ||
} | ||
const middleware = [] | ||
const addMiddleware = handler => { | ||
if (typeof handler === 'function') middleware.push(handler) | ||
} | ||
let unknownRouteHandler = defaultUnknownRoute | ||
@@ -113,2 +118,6 @@ let defaultHeaders = { | ||
try { | ||
for (let fn of middleware) { | ||
await fn(event, context, requestPath, httpMethod) | ||
} | ||
let result = await (route | ||
@@ -143,6 +152,7 @@ ? route.handler(event, context) | ||
return { | ||
get: add.bind(null, 'GET'), | ||
post: add.bind(null, 'POST'), | ||
put: add.bind(null, 'PUT'), | ||
delete: add.bind(null, 'DELETE'), | ||
beforeRoute: addMiddleware, | ||
get: addRoute.bind(null, 'GET'), | ||
post: addRoute.bind(null, 'POST'), | ||
put: addRoute.bind(null, 'PUT'), | ||
delete: addRoute.bind(null, 'DELETE'), | ||
unknown: handler => { | ||
@@ -149,0 +159,0 @@ unknownRouteHandler = handler |
31265
291
184
14