route-decorators

ES7 decorators that simplify Koa and Express route creation

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
route-decorators
7520.2.28 years ago8 years agoMinified + gzip package size for route-decorators in KB

Readme

route-decorators for Koa/Express

NPM
Build Status
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 @route that automatically supply the method argument.

Test

npm install
npm test