microapi
Plug and play API server for Async microservices.
(requires Node >= 7.6 for async/await support).
Usage
npm install microapi
const Microapi =const app =/* Define routes, schemas and middleware under ./api */app // or an absolute pathapp
Motivation
- Automating mounting to remove manual wiring.
- Reducing the setup time for new microservices.
- Separating parameter validation from handlers.
- Exposing schemas for documentation purposes.
- WYSIWYG-style workflow: routes from directories.
Workflow
- Create directories according to your API paths: e.g. /path/to/a/resource/_id/collection.
- Add files to such directories to handle HTTP verbs: i.e. get.js post.js put.js delete.js.
- Add middleware files to run for specific routes: use.js files alongside {verb}.js files.
- Add schemas and request/response validation functions to check request parameters.
- Generate documentation by running
microjoi
to convert (Joi) schemas to (Swagger).
Directory Structure
/your-project
/api
/routes
/schemas
/middleware
/routes (same for /schemas except use.js)
get.js
post.js
use.js
...
/{resource}
...
/_{parameter} (prefix directories with "_" to create URL parameters)
...
/{collection}
get.js
post.js
use.js
...
/middleware
index.js
some-middleware.js
another-middleware.js
...
File Structure
./api/routes
[get|post|put|delete].js
module {// return {body: ..., status: 200}}
use.js
module {// return Promise.reject({body: ..., status: 400}) to interrupt the middleware flow}
./api/schemas
[get|post|put|delete].js
The properties of request[path|query|body|header] objects must be Joi schemas (i.e. name: joi...
pairs).
const joi =const schemas =request:path: {}query: {}body: {}header: {}responses:default:description: ''body: {}examples: {}{// request.validation = {body: {details: request.validation.details}}// delete request.validation// return Promise}{// return Promise}moduleexports =description: ''definitions: schemasvalidations:request: validateRequestresponse: validateResponse
./api/middleware
index.js
Insert the middleware into the array in the desired order of execution.
const middleware = modulemoduleexports =middlewaredefaultmiddlewaremiddlewareName...
{middleware-name}.js
moduleexports = async {// downwards codeawait// upwards code}