Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

26 Commits

Repository files navigation

microapi

Plug and play API server for Async microservices.

(requires Node >= 7.6 for async/await support).

Usage

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)

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

  1. Create directories according to your API paths: e.g. /path/to/a/resource/_id/collection.
  2. Add files to such directories to handle HTTP verbs: i.e. get.js post.js put.js delete.js.
  3. Add middleware files to run for specific routes: use.js files alongside {verb}.js files.
  4. Add schemas and request/response validation functions to check request parameters.
  5. 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.exports=asyncfunctionhandler({ request, params }){// return {body: ..., status: 200}}

use.js

module.exports=asyncfunctionhandler({ request, params }){// 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).

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}}

./api/middleware

index.js

Insert the middleware into the array in the desired order of execution.

constmiddleware=require('require-directory')(module)module.exports=[middleware.default,middleware.{middlewareName},
...
]

{middleware-name}.js

module.exports=async({request, params},next)=>{// downwards codeawaitnext()// upwards code}

About

Plug and play API server for Async microservices.

Resources

Stars

7 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages