ES7 decorators that simplify Koa and Express route creation
ES7 decorators that simplify Koa and Express route creation. Using these decorators, you can write your controllers like below and have all the routes populated.
Koa
import {controller, get, post} from 'route-decorators'
@controller('/users', middleware1)
class UserCtrl {
@get('/:id', middleware2, middleware3)
async get(context, next) {}
@post(middleware2)
async post(context, next) {}
}
Express
import {controller, get, post} from 'route-decorators'
@controller('/users', middleware1)
class UserCtrl {
@get('/:id', middleware2, middleware3)
async get(req, res, next) {}
@post(middleware2)
async post(req, res, next) {}
}
Once the decorators are applied, every controller instance will receive a $routes
array, which you can use to define actual Koa/Express routes.
Assume the above UserCtrl
definition, you can define routes in UserCtrl
's constructor (although really you can put the code anywhere) as follows:
Koa
import Router from 'koa-66'
// Inside controller constructor
this.router = new Router()
for (const {method, url, middleware, fnName} of this.$routes) {
this.router[method](url, ...middleware, this[fnName].bind(this))
}
Express
import express from 'express'
// Inside controller constructor
this.router = express.Router()
for (const {method, url, middleware, fnName} of this.$routes) {
this.router[method](url, ...middleware, (req, res, next) => {
this[fnName](req, res, next).catch(next)
})
}
You can move the above logic to some base controller in your app and reuse it for every controller. For example:
class BaseCtrl {
constructor() {
this.router = new Router()
for (const {method, url, middleware, fnName} of this.$routes) {
this.router[method](url, ...middleware, this[fnName].bind(this))
}
}
}
@controller(...)
class UserCtrl extends BaseCtrl {
// decorated methods as above
}
@controller(path: optional, ...middleware: optional)
@route(method, path: optional, ...middleware: optional)
@head
, @options
, @get
, @post
, @put
, @patch
, @del
, @delete
, @all
: wrappers of @route
that automatically supply the method
argument.npm install
npm test