১. ভূমিকা: route.js / route.ts কি?
-
Next.js এর App Router (beta) এ Route Handlers তৈরি করার জন্য
route.jsবাroute.tsফাইল ব্যবহার করা হয়। (Next.js) -
এগুলি UI পেজ নয় — বরং HTTP request (GET, POST, PUT, DELETE ইত্যাদি) হ্যান্ডল করার জন্য Server-side কোড। (Next.js)
-
এটি Web Request & Response APIs (মডার্ন ব্রাউজার API) এর সাথে কাজ করে। (Next.js)
২. কোন ডিরেক্টরিতে ফাইল হবে?
-
route.js/route.tsফাইল app ডিরেক্টরির একটি সাব-ফোল্ডারে থাকে, যেখানে তুমি ওই রুটের জন্য API হ্যান্ডলার তৈরি করতে চাও। (Next.js) -
উদাহরণস্বরূপ:
app/ ├── route.ts ← এটি root-level রুট হ্যান্ডলার └── dashboard/ └── route.ts ← `/dashboard` রুটের রুট হ্যান্ডলার
৩. HTTP মেথড সমর্থন ও Signature
Route হ্যান্ডলার সাধারণত নিম্নলিখিত মেথডগুলি নিয়ে কাজ করতে পারে:
-
GET -
POST -
PUT -
PATCH -
DELETE -
HEAD -
OPTIONS(Next.js)
Function Signature
export async function GET(request: Request, context?: { params: Promise<{ ... }> }) {
// logic
return new Response(...) // বা NextResponse
}
-
request— এটি একটি NextRequest অবজেক্ট (Web Request API-এর এক্সটেনশন) (Next.js) -
অতিরিক্ত অপশনাল
context— এখানে থাকেparams(dynamic route parameters) (Next.js)
উদাহরণ:
import type { NextRequest } from 'next/server';
export async function GET(request: NextRequest) {
const url = request.nextUrl;
// ...
return Response.json({ message: "Hello World" });
}
Dynamic route segment সহ:
export async function GET(
request: Request,
{ params }: { params: Promise<{ team: string }> }
) {
const { team } = await params;
return new Response(JSON.stringify({ team }), {
headers: { "Content-Type": "application/json" },
});
}
৪. Dynamic Segments (ডায়নামিক রুট সংখ্যক অংশ)
যদি রুটের অংশটি ডায়নামিক হয় (যেমন [id], [slug]), তাহলে params ব্যবহার করতে হবে। (Next.js)
উদাহরণ:
// app/items/[slug]/route.ts
export async function GET(
request: Request,
{ params }: { params: Promise<{ slug: string }> }
) {
const { slug } = await params;
// slug অনুযায়ী ডেটা ফেচ করো
return new Response(JSON.stringify({ slug }));
}
Catch-all segments (যেমন [...slug]) ও optional catch-all (যেমন [[...slug]]) ও ব্যবহার করা যেতে পারে। (Next.js)
৫. রেসপন্স তৈরি করা (Response / NextResponse / কাস্টম হেডার ইত্যাদি)
Route handler থেকে যেভাবেই রেসপন্স পাঠাতে পার:
-
Response(Web API) -
NextResponse— Next.js এর এক্সটেনশন, যাতে তুমি সহজে cookies, redirects, rewrites, headers সেট করতে পারো (Next.js)
উদাহরণ (JSON রেসপন্স, হেডার সহ):
import { NextResponse } from 'next/server';
export async function GET(request: Request) {
const data = { hello: "world" };
return NextResponse.json(data);
}
কাস্টম হেডার সেট করা:
export async function GET(request: Request) {
return new Response("OK", {
status: 200,
headers: {
"Content-Type": "text/plain",
"X-Custom": "value"
},
});
}
Redirect / Rewrite:
import { NextResponse } from 'next/server';
export async function GET(request: Request) {
return NextResponse.redirect(new URL("/login", request.url));
}
৬. ক্যাশিং ও রি-ভ্যালিডেশন (Revalidation / Caching)
Route হ্যান্ডলারগুলোর জন্য তুমি কিছু Route Segment Config অপশন export করতে পারো:
-
revalidate— রিসোর্স多久 পরে রিফ্রেশ হবে -
dynamic— এই রুটটি ডাইনামিক হবে কিনা -
অন্যান্য অপশন:
runtime,preferredRegionইত্যাদি (Next.js)
উদাহরণ:
export const revalidate = 60; // 60 সেকেন্ড পর রিফেচ হবে
export async function GET(request: Request) {
const posts = await fetch("https://api.example.com/posts").then(r => r.json());
return NextResponse.json(posts);
}
ডাইনামিক হিসেবে নির্ধারণ:
export const dynamic = "force-dynamic";
export async function GET(request: Request) {
// ...
}
৭. POST ও রিকোয়েস্ট বডি (Request Body)
POST মেথড ব্যবহার করলে রিকোয়েস্ট বডি পড়তে হবে:
export async function POST(request: Request) {
const body = await request.json();
// body এ যে JSON পাঠানো হয়েছে তা parse হবে
return NextResponse.json({ received: body });
}
যদি formData পাঠাও:
export async function POST(request: Request) {
const form = await request.formData();
const name = form.get("name");
// ...
return NextResponse.json({ name });
}
৮. উদাহরণ একটি সম্পূর্ণ রুট হ্যান্ডলার
ধরা যাক তুমি /api/users/[id] রুট হ্যান্ডলার বানাতে চাও:
app/
└─ api/
└─ users/
└─ [id]/
└─ route.ts
route.ts:
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
export const revalidate = 30;
export const dynamic = "force-dynamic";
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const { id } = await params;
// ধরো ডাটাবেস বা এপিআই থেকে ইউজার লোড করো
const user = { id, name: "User " + id };
return NextResponse.json(user);
}
export async function POST(request: NextRequest) {
const body = await request.json();
// নতুন ইউজার তৈরি করো ...
return NextResponse.json({ created: true, body });
}
export async function DELETE(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const { id } = await params;
// ইউজার ডিলিট করো ...
return new Response(null, { status: 204 });
}
৯. গতির দিক ও Behavior (Behavior / Caveats)
-
Soft Navigation vs Hard Navigation: UI রাউট নেভিগেশন হলে client-side transition, কিন্তু ব্রাউজার রিফ্রেশ করলে کامل রাউট হ্যান্ডলার কল হবে।
-
Default OPTIONS: যদি তুমি
OPTIONSমেথড ডিফাইন না করো, Next.js স্বয়ংক্রিয়ভাবেOPTIONSহ্যান্ডলার তৈরি করবে এবংAllowহেডার সেট করবে। (Next.js) -
Type Safety: তুমি
RouteContextটাইপ ব্যবহার করতে পারো, যাতেparamsটাইপ সঠিকভাবে নির্ধারণ হয়। (Next.js) -
ক্যাশিং ও Caching বিলম্ব: যদি রুটটি static ভাবে রেন্ডার হচ্ছে, তা dynamic করতে হলে
dynamic = "force-dynamic"ব্যবহার করতে পারো। (GitHub)
১০. সারাংশ ও পরবর্তী ধাপ
Route handlers (route.js / route.ts) Next.js 16 (beta / App Router) এ একটি শক্তিশালী পন্থা HTTP request হ্যান্ডল করার জন্য।
তোমার হাতে থাকা কাজ:
-
প্রয়োজনমতো route.ts ফাইল তৈরি করা
-
GET / POST / অন্যান্য মেথড হ্যান্ডল করা
-
ডায়নামিক রুট পারামস্ ব্যবহার করা
-
Response / NextResponse দিয়ে রেসপন্স তৈরি করা
-
ক্যাশিং ও রি-ভ্যালিডেশন সেট করা
-
ফর্ম ডেটা / JSON বডি হ্যান্ডল করা
