koa-router-decorators-async

ES7 decorators for koa-router


Keywords
Koa, REST API, Router, ES7, decorators
License
MIT
Install
npm install koa-router-decorators-async@0.4.6

Documentation

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