decoration style koa server with typescript
There is a scaffold for deco-brick
npm i -g deco-brick-cli
deco-brick-cli init <project>
cd <project> && yarn
yarn start:dev
brick server config as blow:
{
port: 3000, // koa server port
controllerPath: PATH_TO_CONTROLLER, // controller path, string or array
viewPath: PATH_TO_VIEWS // optional, html files path
}
example:
import { BrickServer } from 'deco-brick';
const app = new BrickServer({
port: 3000,
controllerPath: __dirname + '/controllers',
viewPath: __dirname + '/../../views'
});
app.start();
custom your own koa server
import log = require('./middlewares/log');
import errorHandler = require('./middlewares/error-handler');
import bodyParser = require('koa-bodyparser');
const session = require('koa-session');
import { BrickServer } from 'deco-brick';
class App extends BrickServer {
start() {
// load body parse
this.koa.use(bodyParser({
onerror: function (err, ctx) {
ctx.throw('body parse error', 422);
}
}));
// load cors
this.useCors();
// load session
this.koa.keys = [ 'secret-shhh' ];
this.koa.use(session(this.koa));
this.koa.use(log());
this.koa.use(errorHandler());
super.start();
}
}
const app = new App({
port: 3000,
controllerPath: __dirname + '/controllers',
viewPath: __dirname + '/../../views'
});
app.start();
The closest decorator in controller functions must be one of GET, POST, PUT, DEL
.
Using koa-router
for routes, you can use koa-router
path style with GET, POST, PUT, DEL
decorator.
The Validate
decorator use joi
to validate params. All ctx.params
,ctx.request.query
and ctx.request.body
data are in ctx.params
after validate.
Using koa-views
and underscore
to render views in viewPath
you set.
Using BeforeMiddleware
and AfterMiddleware
decorator hook some middleware in route lifecycle like koa.
A controler demo demo as below:
import { GET, POST, PUT, DEL, Validate, Render, BeforeMiddleware, AfterMiddleware } from '../cores/Decorator';
import Joi = require('joi');
import { m1, m2, m3, m4 } from '../middlewares/middleware';
class Controller {
@BeforeMiddleware(m1())
@BeforeMiddleware(m2())
@AfterMiddleware(m3())
@AfterMiddleware(m4())
@GET('/')
async get (ctx: any) {
return await Promise.resolve({ message: 'hello world' });
}
@Render('index')
@GET('/view')
async page (ctx: any) {
return { name: 'pascal' };
}
@Validate({
username: Joi.string().required(),
password: Joi.string().required(),
})
@POST('/login')
async login (ctx: any) {
return await Promise.resolve({ status: 'success' });
}
}
export = Controller;