Skip to content
koa router ES7 decorators
TypeScript JavaScript
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
src lib update Oct 5, 2015
test
typings typescript mocha testing Sep 21, 2015
.editorconfig initial commit Aug 28, 2015
.gitattributes
.gitignore
.npmignore Added Test Cases Aug 29, 2015
LICENSE
README.md typescript mocha testing Sep 21, 2015
index.js
package.json
tsconfig.json
tsd.json
tslint.json switching to typescript Sep 7, 2015

README.md

Koa Router Decorators

ES7 decorators for koa-router model.

Installation

$ npm i koa-router-decorators --save

Usage

This library supports ES7 decorators proposal which is supported by babel and typescript. To use it with babel you should enable experimental es7.decorators feature in babel as described here. To use it with typescripts you should enable experimentalDecorators and emitDecoratorMetadata in tsconfig.json

 @route(path, HttpMethod, ...middleware)
 optional middlewares are added before the target method. 

See trust-broker for more examples

Example

import {route, HttpMethod} from 'koa-router-decorators';
import User from '../models/User'

@route('/users')
export default class UserController {

  router:Router;

  constructor() {
    return this.router.routes();
  }
  
  @route('/', HttpMethod.GET, isAdmin)
  static *index(next) {
    let query = User.find().skip(0).limit(20);
    let users = yield query.exec();
    let count = yield User.count();
    this.body = {users, count};
  }

  @route('/', HttpMethod.POST)
  static *create(next) {
    let newUser =  new User(this.request.body);
    let result;
    try {
      result = yield newUser.save();
    } catch (err) {
      this.throw( 'DB Error: Unable to save', 500);
    }

    this.status = 201;
    this.body = result
  }
}

function *isAdmin(next) {
  if (!this.state.user.roles.includes('admin')) {
    throw new AuthorizationError(AuthorizationError.code.FORBIDDEN, {message: 'insufficient role (admin only)'});
  }
  yield next;
}

Annotated routes are applied at the end. may overwrite manual added routes if path/method matches.

import koa from 'koa';
import Router from 'koa-router';
import bodyParser from'koa-bodyparser';
import UserController from  './controllers/UserController';

rootRouter = new Router({
  prefix: '/api'
});

app = koa();
app.use(bodyParser());
app.use(new AuthController());
rootRouter.use('/v1', new UserController());
app
  .use(rootRouter.routes())
  .use(rootRouter.allowedMethods());
app.listen(3000);

Development

You need typescript installed globally

npm install -g typescript
npm install -g tslint

build

npm run compile  # or just `tsc`

test

npm test # bug :  if you see error: remove "pretest": "tsc -p ./test" from package.json and try again.

publish to npm registry

npm publish
You can’t perform that action at this time.