Package Exports
- route-decorators
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (route-decorators) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
route-decorators for Koa/Express
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
}Decorators
@controller(path: optional, ...middleware: optional)@route(method, path: optional, ...middleware: optional)@head,@options,@get,@post,@put,@patch,@del,@delete,@all: wrappers of@routethat automatically supply themethodargument.
Test
npm install
npm test