中间件可以在请求到控制器之间的逻辑层,可以在控制器之前做一些逻辑处理。
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小节