Fire Cat
简洁优雅至上的koa上层框架
FireCat
什么是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-validator
,schema
创建规则请参见 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]
})
}
}
部署
打包
npm run build
服务端启动
pm2 start ecosystem.config.js