Skip to content

Commit b4e65f3

Browse files
committed
feat: 规范化middleware书写方式
1 parent 6ed2834 commit b4e65f3

File tree

5 files changed

+82
-30
lines changed

5 files changed

+82
-30
lines changed

src/decorator/httpRouter.ts

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { META_ROUTER } from '../constants'
2-
import { RouteAop } from '../types'
2+
import { RouteAop, Tag } from '../types'
33
import { Middleware } from 'koa'
44
// create http request method decorator
55
/**
@@ -29,37 +29,25 @@ export const All = createHTTPMethodDecorator('get', 'post', 'put', 'delete')
2929
*/
3030
type HttpMethodReturnType = (
3131
path: string,
32-
aopPlugins?: RouteAop
32+
aopMiddles?: RouteAop
3333
) => MethodDecorator
3434
function createHTTPMethodDecorator(
3535
...methods: Array<string>
3636
): HttpMethodReturnType {
37-
return (path, aopPlugins = {}): MethodDecorator => (
37+
return (path, aopMiddles = {}): MethodDecorator => (
3838
target,
3939
propertyKey,
4040
descripator
4141
) => {
42-
let beforePlugins: Set<Middleware> = new Set()
43-
let afterPlugins: Set<Middleware> = new Set()
44-
const before = aopPlugins.before
45-
const after = aopPlugins.after
46-
if (before) {
47-
for (let plugin of before) {
48-
beforePlugins.add(plugin)
49-
}
50-
}
51-
if (after) {
52-
for (let plugin of after) {
53-
afterPlugins.add(plugin)
54-
}
55-
}
42+
let beforeMiddlesType: Array<Tag> = aopMiddles.before || []
43+
let afterMiddlesType: Array<Tag> = aopMiddles.after || []
5644
Reflect.defineMetadata(
5745
META_ROUTER,
5846
{
5947
methods,
6048
path,
61-
beforePlugins,
62-
afterPlugins
49+
beforeMiddlesType,
50+
afterMiddlesType
6351
},
6452
descripator.value
6553
)

src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ export * from './core'
99
export * from './core/controller'
1010

1111
export * from './decorator/params'
12+
13+
export * from './runtime/koa/middleware'

src/runtime/koa/index.ts

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import * as Koa from 'koa'
22
import * as Router from 'koa-router'
3-
import { installMiddleware } from './middleware'
3+
import { installMiddleware, middlePoll } from './middleware/index'
44
import parseParamsDecorator from './params'
55
import { RuntimeOptions, RouteMetaInterface } from '../../types'
66
import { META_ROUTER } from '../../constants'
77
import { resolvePath } from '../../utils'
8-
8+
const Logger = console
99
/**
1010
* @description 注册中间件调用koa启动服务
1111
* @param controllers
@@ -14,9 +14,8 @@ import { resolvePath } from '../../utils'
1414
function KoaRuntime(controllers: Set<any>, options: RuntimeOptions) {
1515
const app: Koa = new Koa()
1616
const router: Router = new Router()
17-
const plugins: Array<Koa.Middleware> = options.plugins || []
18-
// 注册中间件
19-
installMiddleware(app, plugins)
17+
// 注册全局中间件
18+
installMiddleware(app, middlePoll.golbalMiddle)
2019
for (let controllerMeta of controllers) {
2120
const { path: rootPath, controller } = controllerMeta
2221
if (!rootPath) {
@@ -30,12 +29,31 @@ function KoaRuntime(controllers: Set<any>, options: RuntimeOptions) {
3029
controller[name]
3130
)
3231
if (metaRoute) {
33-
const { methods, path, beforePlugins, afterPlugins } = metaRoute
32+
const {
33+
methods,
34+
path,
35+
beforeMiddlesType,
36+
afterMiddlesType
37+
} = metaRoute
38+
const beforeMiddles = beforeMiddlesType.map(middleType => {
39+
if (middlePoll.routeMiddle.has(middleType)) {
40+
return middlePoll.routeMiddle.get(middleType)
41+
} else {
42+
Logger.error(`[kever|err]: ${String(middleType)} unregistered!`)
43+
}
44+
})
45+
const afterMiddles = afterMiddlesType.map(middleType => {
46+
if (middlePoll.routeMiddle.has(middleType)) {
47+
return middlePoll.routeMiddle.get(middleType)
48+
} else {
49+
Logger.error(`[kever|err]: ${String(middleType)} unregistered!`)
50+
}
51+
})
3452
const routePath: string = resolvePath(rootPath, path)
3553
for (let method of methods) {
3654
router[method](
3755
routePath,
38-
...beforePlugins,
56+
...beforeMiddles,
3957
async (ctx: Koa.Context, next: Koa.Next) => {
4058
// 将ctx和next绑定到controller实例上
4159
controller['ctx'] = ctx
@@ -44,7 +62,7 @@ function KoaRuntime(controllers: Set<any>, options: RuntimeOptions) {
4462
const routeParams = parseParamsDecorator(controller[name], ctx)
4563
await controller[name](...routeParams)
4664
},
47-
...afterPlugins
65+
...afterMiddles
4866
)
4967
}
5068
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import * as Koa from 'koa'
2+
import * as koaBody from 'koa-body'
3+
import koaCookie from 'koa-cookie'
4+
import { Tag } from '../../../types/index'
5+
6+
export const installMiddleware = (app: Koa, middles: Set<Koa.Middleware>) => {
7+
app.use(koaBody())
8+
app.use(koaCookie())
9+
for (let middle of middles) {
10+
app.use(middle)
11+
}
12+
}
13+
14+
/**
15+
* @description 基础的中间件接口,所有的中间件都要继承这个东西
16+
*/
17+
export interface BaseMiddle {
18+
ready(): void
19+
}
20+
21+
interface MiddlePoll<T> {
22+
routeMiddle: Map<Tag, T>
23+
golbalMiddle: Set<T>
24+
}
25+
export const middlePoll: MiddlePoll<Koa.Middleware> = {
26+
routeMiddle: new Map(),
27+
golbalMiddle: new Set()
28+
}
29+
30+
type registerMiddleType = (
31+
tag: Tag
32+
) => <T extends { new (...args: any[]): {}; ready(): void }>(target: T) => void
33+
34+
export const registerMiddle: registerMiddleType = (tag: Tag) => target => {
35+
const instance: BaseMiddle = new target() as BaseMiddle
36+
middlePoll.routeMiddle.set(tag, instance.ready)
37+
}
38+
39+
export const registerGlobalMiddle: registerMiddleType = (
40+
tag: Tag
41+
) => target => {
42+
const instance: BaseMiddle = new target() as BaseMiddle
43+
middlePoll.golbalMiddle.add(instance.ready)
44+
}

src/types/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { Middleware } from 'koa'
22

33
export type Tag = symbol | string
44
export type RuntimeOptions = Partial<Record<'plugins', Array<Middleware>>>
5-
export type RouteAop = Partial<Record<'before' | 'after', Array<Middleware>>>
5+
export type RouteAop = Partial<Record<'before' | 'after', Array<Tag>>>
66
export type InjectMetaType = Record<'propertyKey' | 'tag', Tag>
77

88
export interface RouteMetaInterface {
99
methods: Array<string>
1010
path: string
11-
beforePlugins: Array<Middleware>
12-
afterPlugins: Array<Middleware>
11+
beforeMiddlesType: Array<Tag>
12+
afterMiddlesType: Array<Tag>
1313
}
1414

1515
export interface ControllerInterface {

0 commit comments

Comments
 (0)