🛡 Middleware
Middleware in Flint Dart allows you to run code before a request reaches the route handler. You can use it for tasks like authentication, validation, logging, etc.
Example: Auth Middleware
import 'package:flint_dart/flint_dart.dart';
class AuthMiddleware extends Middleware {
@override
Handler handle(Handler next) {
return (Request req, Response res) async {
final token = req.bearerToken;
if (token == null || token != "expected_token") {
return res.status(401).send("Unauthorized");
}
return await next(req, res);
};
}
}
Example: Validation Middleware
import 'package:flint_dart/flint_dart.dart';
class ValidationMiddleware extends Middleware {
final Map<String, String> rules;
ValidationMiddleware(this.rules);
@override
Handler handle(Handler next) {
return (Request req, Response res) async {
try {
final data = await req.json();
await Validator.validate(data, rules);
return await next(req, res);
} catch (e) {
return res.status(400).json({'error': e.toString()});
}
};
}
}
Using Middleware for a Single Route
You can wrap a specific route handler with middleware by calling its .handle()
method.
import 'package:flint_dart/flint_dart.dart';
import 'package:sample/src/middlewares/auth_middleware.dart';
import '../controllers/user_controller.dart';
void registerUserRoutes(Flint app) {
final controller = UserController();
app.get('/', controller.index);
app.get('/:id', controller.show);
app.post('/', controller.create);
app.put('/:id', AuthMiddleware().handle(controller.update));
app.delete('/:id', AuthMiddleware().handle(controller.delete));
}
Using Middleware for a Group of Routes
You can also apply middleware to an entire route group when mounting it.
import 'package:flint_dart/flint_dart.dart';
import 'package:sample/src/middlewares/auth_middleware.dart';
import 'package:sample/src/routes/auth_routes.dart';
import 'package:sample/src/routes/user_routes.dart';
void main() {
final app = Flint();
app.get('/', (req, res) async {
return res.send('Hello from Flint Dart!');
});
app.mount("/users", registerUserRoutes, middlewares: [
AuthMiddleware(),
]);
app.mount("/auth", authRoutes);
app.listen(3000);
}
Chaining Middleware with .useMiddleware()
Flint Dart also lets you attach middleware directly to a specific route using the .useMiddleware()
method. You can chain multiple middleware functions, and they will run in the order they were added.
import 'package:flint_dart/flint_dart.dart';
import 'package:sample/src/middleware/auth_middleware.dart';
void main() {
final app = Flint();
app.get('/profile', (req, res) async {
return res.json({'msg': 'This is a protected route'});
}).useMiddleware(AuthMiddleware());
app.listen(3000);
}
✅ In this example, the AuthMiddleware
is applied twice for demonstration. In real use, you can mix and match multiple middleware (e.g., AuthMiddleware
, LoggingMiddleware
,RateLimiterMiddleware
) to build a secure and layered request pipeline.