Plug and play API server for Async microservices.
(requires Node >= 7.6 for async/await support).
npm install microapi const Microapi = require('microapi/koa') const app = new Microapi() /* Define routes, schemas and middleware under ./api */ app.define('./api') // or an absolute path app.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 = async function handler({ request, params }) { // return {body: ..., status: 200} }module.exports = async function handler({ 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).
const joi = require('joi') const schemas = { request: { path: {}, query: {}, body: {}, header: {} }, responses: { default: { description: '', body: {}, examples: {} } } } function validateRequest(request) { // request.validation = {body: {details: request.validation.details}} // delete request.validation // return Promise } function validateResponse(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.
const middleware = require('require-directory')(module) module.exports = [ middleware.default, middleware.{middlewareName}, ... ]module.exports = async ({request, params}, next) => { // downwards code await next() // upwards code }