Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/miserylee/koact
Smart koa routes manager.
https://github.com/miserylee/koact
api auto-doc document documentation koa middleware router
Last synced: 6 days ago
JSON representation
Smart koa routes manager.
- Host: GitHub
- URL: https://github.com/miserylee/koact
- Owner: miserylee
- Created: 2018-05-18T09:24:17.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2022-12-09T08:39:40.000Z (about 2 years ago)
- Last Synced: 2024-01-30T04:13:07.169Z (11 months ago)
- Topics: api, auto-doc, document, documentation, koa, middleware, router
- Language: TypeScript
- Homepage:
- Size: 70.3 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# koact
## ![NPM version](https://img.shields.io/npm/v/koact.svg?style=flat)
### 这是什么?
`koact`是一个便捷的`koa`应用的路由管理器。
### 怎么使用?
```js
// 使用 yarn 或 npm 安装 koact
import koact from 'koact';
import * as Koa from 'koa';const app = new Koa();
const router = koact(path.resolve(__dirname, 'routes'));
koa.use(router);
koa.listen(3000);
```路由文件放在上面代码指定的`routes`文件夹下即可。
`koact`函数的具体定义如下:
```js
export interface IOptions {
resolves?: string[]; // 指定ext的文件将会被解析,默认值为['.js', '.ts', '.node']
docSecret?: string; // 指定接口文档的访问密钥,默认无密钥,可随意访问
}
/*
routesPath: 路由文件所在的文件夹
enhancers: 全局的路由增强器
options: 额外的配置,见IOptions
*/
declare const koact: (routesPath: string, enhancers?: Enhancer[] | undefined, options?: IOptions) => compose.Middleware;
```### 怎么写路由文件?
每一个路由文件即代表一个API模块,其相对于`routes`的路径即为`pathname`;
文件名的格式为`[.version]#.js|ts`;
例如: `routes/userInfo/GET#获取账户信息.ts` 表示接口`pathname=/userInfo method=GET version=default 接口名=获取账户信息`;
若文件路径中包含了`#param`的部分,则会被解析为`params`参数;
**注意:若文件名以 _ 开头,则认为该文件是非路由文件,会被解析器忽略。**
在路由文件内`export default`一个类型为`IAPI`的模块即可自动解析为API接口,`IAPI`类型的定义如下:
```js
export interface IObject {
[key: string]: any;
}export type APIHandler
= (data: { params: P, query: Q, body: B, ctx: Context, next: () => Promise }) => Promise; // 对接口业务函数的定义
export interface IAPIBase
extends IObject {
params?: IObject; // 对params进行校验的数据结构模板
query?: IObject; // 对query进行校验的数据结构模板
body?: IObject; // 对body进行校验的数据结构模板
res?: any; // 对返回值responseBody进行数据结构校验的模板
handler?: APIHandler; // 接口执行函数
pre?: Middleware[]; // 该接口适用的koa中间件
useCustomBodyParser?: boolean; // 标记是否适用自定义的bodyParser模块,适用自定义bodyParser模块时,koact会忽略内置的bodyParser,所以必须在前置中间件中加入自定义的bodyParser模块才可以对body数据进行解析
}// 对接口增强器的定义,增强器用于在运行时对接口定义进行改写
export type Enhancer = (api: IAPIBase, info: { method: string, name: string, path: string }) => IAPIBase;// IAPI 的类型定义
export interface IAPIextends IAPIBase
{
enhancers?: Enhancer[]; // 该接口的增强器
}
```其中对参数和返回值进行数据校验的数据结构模板,使用了`schema.io`库来进行。在这里[schema.io](https://github.com/miserylee/schema.io)查看具体使用方法。
一个简单的接口定义文件示例:
```js
import { IAPI } from 'koact';export default {
query: {
name: String,
},
res: String,
async handler({ query }): Promise {
return `Hello ${query.name}`;
},
pre: [async (ctx, next) => {
ctx.set('file', __filename);
await next();
}],
} as IAPI<{}, {
name: string;
}, {}, string>;
```### 自动的接口文档 & 局部接口配置
可以在相应的文件夹下定义`META.ts|js`文件来定义自动化生成的文档入口和局部(即META文件所在目录及所有子目录下)接口的统一配置:
`META`文件中`export default`一个类型为`IMeta`的模块即可被解析,`IMeta`的定义如下:
```js
export interface IMetaBase extends IObject {
title?: string; // 文档的title
description?: string; // 文档的描述
notSubDoc?: boolean; // 是否生成子文档,默认true
}export interface IMeta extends IMetaBase {
pre?: Middleware[]; // 局部接口配置的前置中间件
enhancers?: Enhancer[]; // 局部接口配置的增强器
}
```一个简单的`Meta`文件示例:
```js
import { IAPIBase, IMeta } from 'koact';export default {
title: 'This is the API documents.',
plugins: [(api: IAPIBase, { method, name, path }) => {
console.log(name, method, path);
if (!api.pre) {
api.pre = [];
}
api.pre.push(async (ctx, next) => {
ctx.set('dir', __dirname);
await next();
});
return api;
}],
} as IMeta;
```### 一个完整的路由文件夹的结构
大概长这样
```bash
routes
├── GET#Gateway.ts
├── META.ts
├── POST#Test\ post.ts
├── manyVersions
│ ├── META.ts
│ ├── _private // 该文件夹下的接口会被忽略
│ │ └── GET#Private\ interface.ts
│ └── user
│ └── #id // 会被解析成params中的id参数
│ ├── GET#Get\ a\ user.ts
│ └── GET.v2#Get\ a\ user.ts // 不同版本的接口,但pathname一样
├── multipart
│ └── POST#Test\ multipart.ts // 对multipart的解析
├── nested
│ └── nested
│ ├── GET#Nested\ API.ts
│ ├── META.ts
│ └── notSub
│ ├── GET#not\ sub\ gateway.ts
│ └── META.ts // 不生成子文档,仅仅作为局部接口的统一配置
└── sub
└── GET#sub\ gateway.ts
```可以在项目`test/routes`目录下查看具体每个模块文件的详细内容。
### 自动生成的文档
`koact`会自动生成api接口文档,可以通过`http:///api.doc`来进行访问。
通过上述地址访问到的为`json`格式的文档数据,也可以使用同一的GUI网页来对文档进行访问:`http://koact-doc.bestneverland.com/`,在页面中输入服务地址和文档密钥即可。
### 自动生成web前端项目的API定义代码
配合[koact-doc-to-definition](https://github.com/miserylee/koact-doc-to-definition)工具,可以在web前端项目中自动生成`koact`路由服务的访问代码。