Dù Server Actions đã thay thế nhiều tác vụ, nhưng Route Handlers và Middleware vẫn là xương sống cho các hệ thống phức tạp.
1. Route Handlers (route.ts)
Route Handlers cho phép bạn tạo REST API tùy chỉnh bằng Web Request và Response APIs.
Vị trí: Nằm trong folder app/, cùng cấp với các trang nhưng không được đặt cạnh page.tsx.
// app/api/webhook/route.ts
import { NextResponse } from 'next/server';
export async function POST(request: Request) {
const body = await request.json();
// Xử lý webhook từ Stripe/PayPal
console.log(body);
return NextResponse.json({ received: true });
}Các Method hỗ trợ: GET, POST, PUT, PATCH, DELETE, HEAD, và OPTIONS.
Dynamic Route Handlers
Mặc định GET request sẽ được Next.js Cache vĩnh viễn (Static). Để chuyển sang Dynamic:
- Dùng
cookies(),headers(). - Dùng
{ cache: 'no-store' }. - Hoặc cấu hình:
export const dynamic = 'force-dynamic'.
2. Middleware (middleware.ts)
Middleware cho phép bạn chạy code trước khi một request hoàn tất. Bạn có thể thay đổi response bằng cách redirect, rewrite, hoặc sửa header.
Vị trí: Phải đặt ở root của dự án (cùng cấp với app/ hoặc src/).
// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
export function middleware(request: NextRequest) {
const token = request.cookies.get('token');
// Check login cho Dashboard
if (request.nextUrl.pathname.startsWith('/dashboard')) {
if (!token) {
return NextResponse.redirect(new URL('/login', request.url));
}
}
return NextResponse.next();
}
// Chỉ chạy cho các URL cụ thể để tiết kiệm hiệu năng
export const config = {
matcher: ['/dashboard/:path*', '/api/admin/:path*'],
};3. Khi nào dùng cái nào?
| Tình huống | Giải pháp |
|---|---|
| Gửi Form, Update DB | Server Actions (Khuyên dùng). |
| Webhooks (Stripe, PayPal) | Route Handlers. |
| Bán API cho bên thứ 3 | Route Handlers. |
| Redirect dựa trên Auth/Role | Middleware. |
| Đổi ngôn ngữ (i18n) | Middleware. |
| A/B Testing | Middleware. |
4. Edge Runtime vs Node.js Runtime
- Middleware: Luôn chạy trên Edge Runtime (vô cùng nhanh, nhẹ nhưng không hỗ trợ đầy đủ thư viện Node.js như
fshaynet). - Route Handlers: Có thể cấu hình chạy Node.js (mặc định) hoặc Edge.
Kết luận
- Đừng lạm dụng Route Handlers cho các tác vụ UI thông thường (hãy dùng Server Actions).
- Tận dụng Middleware để làm "lá chắn" bảo mật ngay từ cổng vào của ứng dụng.
- Luôn đặt
matchertrong Middleware để tránh chạy lãng phí trên file ảnh/tĩnh.