fire-cat:一切以优雅至上的koa上层框架

75 阅读2分钟

logo

Fire Cat

简洁优雅至上的koa上层框架

FireCat

image.png

什么是FireCat?FireCat Github

import {FireCat} from "fire-cat";
import {fireCatRouter} from "./router";

const app = new FireCat();

app.koa.use(fireCatRouter.router.routes());
app.koa.listen('3010');

console.log(
  `🐳️app is running at http://127.0.0.1:3010`,
);

FireCat是基于koa的,所以实现服务看起来和koa没什么两样

控制器&装饰器

class MyController extends FireCatController {
  @Request()
  @Get('hello')
  hello(ctx: Context) {
    console.log(ctx.request.body)
    ctx.body = "hello world"
  }
  
  @Request()
  @Post('hello2')
  hello2(ctx: Context) {
    console.log(ctx.request.body)
    ctx.body = "hello world"
  }
}

路由&控制器映射

注册控制器路由

controller(path: string, control: FireCatController)

注册控制器到指定路由上,会自动映射控制器里面的路由

const fireCatRouter = new FireCatRouter()

fireCatRouter.controller('/book', new MyController())

注册分组路由

group(path: string, wrap: (router: FireGroupRouter) => void)

分组路由

const fireCatRouter = new FireCatRouter()

fireCatRouter.group('/book', (book) => {
  book.get('/foo', ()=> {})
  book.get('/bar', ()=> {})
  book.controller('/book', new SomeContoler())
})

自定义装饰器

很多时候,我们使用koa中间件来实现拦截器的功能,在fire-cat中,你只需要使用装饰器,就可以简单实现这个功能。

创建自定义装饰器

import {FireCatDecorator} from "fire-cat";

// 验证登陆
export const AuthLogin = function () {
  return FireCatDecorator.registerImplement((ctx, next) => {
    // 模拟解析出用户数据
    ctx.state.userInfo = {
      id: 1,
      name: 'fake',
      some: 'bar'
    }
    next()
  })
}

然后你就可以在控制器里面使用这个拦截器了

class MyController extends FireCatController {
  @Post('hello')
  @AuthLogin()
  hello(ctx: Context) {
    console.log(ctx.state.userInfo)
    ctx.body = "hello world"
  }
}

验证

fire-cat提供了基本的验证的解决方案 首先你要继承控制器,实现对验证失败后的处理

import {FireCatVerifyWrap} from "fire-cat";
import {Context} from "fire-cat/lib/types";

class AppVerifyController extends FireCatController {
  async wrap(ctx: Context, message: string) {
    ctx.body = {
      msg: message
    }
  }
}

然后注册自定义的验证拦截器

export const AppVerify = FireCatVerifyWrap(async (message, ctx, next)=> {
  if (message) {
    await new AppVerifyController().wrap(ctx, message.message)
  } else {
    await next()
  }
})

就可以在控制器实现验证,验证基于fastest-validatorschema创建规则请参见 fastest-validator文档

// /controllre/book/schema.ts
import {createSchema} from "fire-cat";
export default {
  createBook: createSchema({
    name: {
      type: 'string',
      empty: false,
      max: 255,
    },
    auther: {
      type: 'string',
      empty: false,
      max: 100,
    }
  }),
}
// /controllre/book/index.ts
import {Post, Request} from "fire-cat";

export default class BookController extends FireCatController {
  @Request()
  @Post('create')
  @AppVerify(schema.createBook) // 验证
  async createBook(ctx: Context) {
    // 通过后才会进入到控制器里面
    // ...
  }
}

文档服务

开启文档服务

fireCatRouter.enableDocument()

自定义文档服务路径

fireCatRouter.enableDocument('/document')

自定义文档描述

fireCatRouter.enableDocument('/document', {
  title: '接口文档',
  description: '这是接口文档',
  date: '2022-05-20',
  version: '1.0.0'
})

ApiDescription

ApiDescription(des: string)

对请求进行描述,会渲染到最终的文档里面

class MyController extends FireCatController {
  @ApiDescription('这是一个请求')
  @Post('hello')
  hello(ctx: Context) {
    ctx.body = "hello world"
  }
}

最佳实践

实现自己的控制器

实现自己的控制器的好处,是可以灵活拓展控制器方法。

import {FireCatController} from "fire-cat";

export class AppController extends FireCatController {
  success(props: object) {
    return {
      code: 200,
      data: props
    }
  }
  error(props: object) {
    return {
      code: 500,
      data: props
    }
  }
}

然后你就可以愉快的使用

class MyController extends AppController {
  @Post('hello')
  hello(ctx: Context) {
    ctx.body = this.success({
      list: [1, 2, 3]
    })
  }
}

image.png

部署

打包

npm run build

服务端启动

pm2 start ecosystem.config.js

更多详见 FireCat Github