中间件

中间件在请求到达控制器之前执行。它可以修改请求、添加参数或停止响应。

创建中间件

import 'package:finch/finch_route.dart';

class AuthMiddleware extends Middleware {
  @override
  Future<MiddlewareResult> handle(FinchRequest rq) async {
    var token = rq.headers['authorization']?.first ?? '';

    if (token.isEmpty) {
      return MiddlewareResult.stop(
        rq.renderData(
          data: {'error': '需要认证'},
          statusCode: 401,
        ),
      );
    }

    var user = await UserService.verifyToken(token);
    if (user == null) {
      return MiddlewareResult.stop(
        rq.renderData(
          data: {'error': '无效的令牌'},
          statusCode: 401,
        ),
      );
    }

    // 将用户添加到请求参数
    rq.addParam('currentUser', user);
    return MiddlewareResult.next();
  }
}

MiddlewareResult 返回值

行为
MiddlewareResult.next() 继续处理到下一个中间件/控制器
MiddlewareResult.stop(response) 停止处理并返回响应

将中间件附加到路由

在构造函数中

router.get(
  '/dashboard',
  DashboardController().index,
  middlewares: [AuthMiddleware()],
);

流式方式

router
    .get('/dashboard', DashboardController().index)
    .middleware(AuthMiddleware());

父路由中间件

router.group('/api', (r) {
  r.get('/users', UserController().index);
  r.post('/users', UserController().store);
}).middleware(ApiAuthMiddleware());

在控制器中访问请求

Future<String> index() async {
  var user = rq.getParam<User>('currentUser');
  // 使用 user...
}