中间件可以在请求到控制器之间的逻辑层,可以在控制器之前做一些逻辑处理。
Middleware
是一种特殊的组件,通过使用 @Middleware
装饰器来表示这是一个中间件类
Middleware
组件需要实现 MiddlewareInterface
接口
import { Middleware, MiddlewareInterface, Request, Next }from '@tiger/common'
@Middleware()
export class ExampleMiddleware implements MiddlewareInterface {
resolve(request: Request, next: Next) {
return next()
}
}
next()
的结果必须使用return
返回,next()
总是返回一个包裹Response
的Promise
对象
例子:创建一个中间件,在参数 version
的值为 v1
的时候返回一个 Does not support v1
的响应信息
import { Middleware, MiddlewareInterface, Response } from '@tiger/common'
@Middleware()
export class ExampleMiddleware implements MiddlewareInterface {
resolve(request, next) {
if (request.param('version') === 'v1') {
return new Response().BadRequest('Does not support v1');
}
return next()
}
}
BaseMiddleware
基类提供了许多便捷方法
框架提供了 @use(name)
装饰器来使用中间件
对控制器类使用
import { Controller, use }from '@tiger/common'
import ExampleMiddleware from '../middlewares/example'
@Controller('/books')
@use(ExampleMiddleware)
export class BookController {
// ...
}
中间件将会对该控制器的所有方法生效
对控制器方法使用
import { Controller, Get, use }from '@tiger/common'
import ExampleMiddleware from '../middlewares/example'
@Controller('/books')
export class BookController {
@Get()
@use(ExampleMiddleware)
index() {
// ...
}
}
中间件只会对该控制器的
index
方法生效
import { Middleware } from '@tiger/common'
@Middleware()
export class ExampleMiddleware {
resolve(request, next) {
// todo
return next()
}
}
import { Middleware } from '@tiger/common'
@Middleware()
export default class ExampleMiddleware {
async resolve(request, next) {
const response = await next()
// todo
return response
}
}
next()
函数总是返回Response
对象,详见Response
小节