Plug and play API server for Async microservices.
(requires Node >= 7.6 for async/await support).
npm install microapi
constMicroapi=require('microapi/koa')constapp=newMicroapi()/* Define routes, schemas and middleware under ./api */app.define('./api')// or an absolute pathapp.listen(3000)- 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.
- 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
microjoito convert (Joi) schemas to (Swagger).
/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
...
module.exports=asyncfunctionhandler({ request, params }){// return {body: ..., status: 200}}module.exports=asyncfunctionhandler({ request, params }){// return Promise.reject({body: ..., status: 400}) to interrupt the middleware flow}The properties of request[path|query|body|header] objects must be Joi schemas (i.e. name: joi... pairs).
constjoi=require('joi')constschemas={request: {path: {},query: {},body: {},header: {}},responses: {default: {description: '',body: {},examples: {}}}}functionvalidateRequest(request){// request.validation = {body: {details: request.validation.details}}// delete request.validation// return Promise}functionvalidateResponse(response){// return Promise}module.exports={description: '',definitions: schemas,validations: {request: validateRequest,response: validateResponse}}Insert the middleware into the array in the desired order of execution.
constmiddleware=require('require-directory')(module)module.exports=[middleware.default,middleware.{middlewareName},
...
]module.exports=async({request, params},next)=>{// downwards codeawaitnext()// upwards code}