中间件
中间件在请求到达控制器之前执行。它可以修改请求、添加参数或停止响应。
创建中间件
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...
}