Skip to content

fullstackoverflow/Misc

Repository files navigation

Open in Visual Studio Code Build Status codecov NPM version

Misc

基于Koa与Typescript构建的框架

快速开始

  1. 安装命令行工具
npm i @tosee/misc-cli -g
  1. 初始化项目并运行
mkdir project
misc new ./project
cd project
npm run dev

配置项

Misc继承自Koa,实例化Misc时可以传入不同的参数来配置Koa实例,Misc自带koa-bodyparser,@koa/cors依赖,可以通过不同的配置来实现不同的功能,具体的参数细节查看API

keys

Koa 的 cookie 签名秘钥

beforeall

中间件数组,Misc会使用koa-compose组合数组中的中间件,这些中间处于koa-bodyparser,@koa/cors之后(如果有配置的话),routerpath目录中的各路由之前。

routerpath

Misc会加载该配置目录及其子目录下的所有ts文件,并获取它们的默认导出(export default),如果是koa-router实例(使用@Controller装饰器)则Misc会加载这些实例,默认路径src/router

body

koa-bodyparser配置选项,参照koa-bodyparser

protocol(必须)

可选 http 或 https,选择 https 时则必须配置 tls 选项。

tls

https 配置,详见https 参数

cors

跨域配置,使用@koa/cors,参照@koa/cors

port(必须)

监听端口号。

装饰器

@Controller

路由类装饰器,实例化类时转化为一个koa-router实例,作用类似于prefix,例:

@Controller('/hello');
class Test{

}

@GET

路由方法装饰器,与@Controller配合,实现一个 get 方法的路由,例:

@Controller('/hello');
class Test{
  @GET('/test')
  async test(){
    return 'hello world';
  }
}

@POST

路由方法装饰器,与@Controller配合,实现一个 post 方法的路由,例:

@Controller('/hello');
class Test{
  @POST('/test')
  async test(@Body body){
    return body;
  }
}

@PUT

路由方法装饰器,与@Controller配合,实现一个 put 方法的路由,例:

@Controller('/hello');
class Test{
  @PUT('/test')
  async test(){

  }
}

@DELETE

路由方法装饰器,与@Controller配合,实现一个 delete 方法的路由,例:

@Controller('/hello');
class Test{
  @DELETE('/test')
  async test(){

  }
}

@Body

参数装饰器,配合@POST,@GET,@PUT,@DELETE等方法装饰器时可以获取请求参数,该装饰器默认值为ctx.request.body,例:

@POST('/test')
async test(@Body body){
    return body;
}

@Query

参数装饰器,配合@POST,@GET,@PUT,@DELETE等方法装饰器时可以获取请求参数,该装饰器默认值为ctx.request.query,例:

@GET('/test')
async test(@Query query){
    return query;
}

@Headers

参数装饰器,配合@POST,@GET,@PUT,@DELETE等方法装饰器时可以获取请求参数,该装饰器默认值为ctx.request.headers,例:

@GET('/test')
async test(@Headers headers){
    return headers;
}

@Headers

参数装饰器,配合@POST,@GET,@PUT,@DELETE等方法装饰器时可以获取请求参数,该装饰器默认值为ctx.params,例:

@GET('/test/:id')
async test(@Params params){
    return params.id;
}

@Ctx

参数装饰器,配合@POST,@GET,@PUT,@DELETE等方法装饰器时可以获取请求参数,该装饰器默认值为ctx,例:

@GET('/test/:id')
async test(@Ctx ctx){
    return ctx.params.id;
}

@Validate

参数验证装饰器,使用class-validator实现,传入 schema 即可完成校验,支持自定义错误处理。

使用该装饰器后,参数装饰器获取的参数是经过该装饰器转换过后的参数(例如schema中包含Transform之类的功能),需要获取原始数据可以使用@Ctx装饰器获取koa的Context。

export class Login {
	/**
	 * username describe
	 */
	@IsString()
	username: string;

  /**
	 * password describe
	 */
	@IsString()
	password: string;
}

@Controller('/hello');
class Test{
  @Autowired()
  UserService:UserService

  @GET('/test)
  @Validate({schema:Login,error:(errors)=>{
    throw new Error(`${errors.map(error=>Object.value(error.constraints))}`);
  }})
  async test(@Query query){
    return query;
  }
}

工具

logger

打印信息,分为 error,info,和 succuess,带时间戳和不同颜色

import {logger} from '@tosee/misc'

logger.info("hello world");
app.use(logger.Middleware()); //在后续中间件中的logger打印会带上唯一id,参考@tosee/log

扩展

@tosee/config加载配置文件使用@Value装饰器注入

@tosee/util@Before,@After,@Around,@Catch,@Autowired,@Schedule等工具装饰器

@tosee/busboybusboy的封装,直接处理formdata文件流无临时文件,提供装饰器,中间件与自定义方式

@tosee/log支持RequestID与自定义格式的日志库