Bahas Beberapa Studi Kasus Middleware Pada NextJS
Kali ini kita akan belajar bagaimana cara menerapkan berbagai macam studi kasus middleware di dalam project NextJS. Namun saya harapkan kalian sudah menyelesaikan bagaimana cara membuat API dengan NextJS di postingan sebelumnya
Apa Itu Middleware?
Singkatnya, middleware merupakan script atau function yang dijalankan sebelum request selesai. Artinya, sebelum request diterima oleh server, kode atau function ini akan dijalankan terlebih dahulu
illustrasi cara kerja middleware |
Dalam konteks teknologi NextJS, dengan middleware programmer bisa memodifikasi, mengarahkan, request maupun response.
Apa Itu NextJS?
NextJS merupakan framework berbasis javascript (juga typescript) yang digunakan untuk frontend. NextJS memiliki banyak fitur Server Side Rendering yang mutahir dan menjadi favorit oleh semua programmer
Meskipun ditujukan untuk front-end programmer, NextJS juga bisa menangani urusan backend seperti mengambil data dari database, pembuatan api, dan lain sebagainya. Bisa dikatakan, NextJS juga merupkan framework yang harus dicoba kalo kamu mau seorang fullstack developer
Baca Juga: Tutorial NextJS 13 & Typescript: Membuat Navbar Dengan Shadcn/UI
Kapan Middleware Harus Dibuat?
Biasanya middleware dibuat apapbila diharuskan ada batasan atau aturan untuk user ketika mereka mengakses aplikasi kita
Semisal, kita hanya ingin user yang login adalah hanya admin saja, nah hal ini bisa ditangani di tengah tengah komunikasi antar request dan response saat user ingin login ke dalam aplikasi. Atau, kita ingin aplikasi kita hanya bisa diakses beberapa kali saja dalam sehari, maka kita bisa membuat middleware untuk menangani hal ini
Baca Juga: Konsep Middleware dan Cara Menggunakannya Di NodeJS
Studi Kasus
Matcher
Matcher merupakan jenis middleware dimana function tertentu akan dijalankan pada route tertentu saja.
Pertama buat file middleware.ts dan tulis kode berikut
import { NextResponse } from "next/server";
export function middleware(request: Request) {
const regex = new RegExp("/api/*");
if (regex.test(request.url)) {
}
console.log("Middleware!");
console.log(request.url);
const origin = request.headers.get("origin");
console.log(origin);
return NextResponse.next();
}
export const config = {
matcher: "/api/:path*",
};
hasil keluaran config |
Penjelasan: Sebelum request diterima server, maka console.log akan berjalan dan memunculkan data data dari request seperti url dan method. Persis yang ingin sudah kita tuliskan di file middleware.ts tersebut
Rate Limiter
Rate limiter merupakan tool yang berfungsi untuk memberikan token atau batasan berapa kali user bisa mengakses api kita. Untuk bisa melakukannya, kita harus menginstall package dari npm
npm i limiter
Buat file limiter.ts di dalam folder api/config dengan isi kode berikut
import { RateLimiter } from "limiter";
export const limiter = new RateLimiter({
tokensPerInterval: 3,
interval: "minute",
fireImmediately: true,
});
Buat file route.ts di app/hello. Kita akan menguji limiter ini pada route sederhana
import { NextResponse } from "next/server";
import { limiter } from "../config/limiter";
export async function GET(request: Request) {
const origin = request.headers.get("origin");
const remaining = await limiter.removeTokens(1);
console.log("remaining", remaining);
if (remaining < 0) {
return new NextResponse(null, {
status: 429,
statusText: "Too Many Request",
headers: {
"Access-Control-Allow-Origin": origin || "*",
"Content-Type": "text/plain",
},
});
}
return NextResponse.json({ message: "Hello World!" });
}
Penjelasan: Setiap kali kita ingin mengakses api/hello, setiap menit token akan berkurang 1. Dan jika sudah ada dibawah 0 atau sudah habis maka api akan terblock
isi console |
api terblock yang diakses lewat browser |
Baca Juga: Cara Membuat CRUD API (Create, Read, Update, Delete) Dengan NodeJS dan MongoDB
CORS
CORS adalah singkatan dari Cross Origin Resource Sharing, yaitu kebijakan keamanan yang diterapkan oleh browser web untuk melindungi pengguna dari serangan lintas domain (cross-domain attacks). CORS origin berfungsi untuk mengatur bagaimana sebuah sumber daya web di server (misalnya, file JavaScript, font, atau gambar) dapat diakses oleh halaman web di domain lain.
Kita bisa menerapkan CORS ini untuk api kita, sehingga hanya user dengan headers tertentu yang bisa mengaksesnya. Artinya, kita sebagai programmer yang mempunyai kendali atas api ini bisa diakses oleh siapa
Namun untuk bisa seorang user mengakses aplikasi kita, kita juga harus memberikan aturan yang jelas, kita bisa memberikannya pada headers
Buka file route.ts pada folder app/api/todo
Lalu ubah function GET menjadi seperti ini
export async function GET(request: Request) {
const origin = request.headers.get("origin");
const res = await fetch(DATA_SOURCE_URL);
const todos: Todo[] = await res.json();
return new NextResponse(JSON.stringify(todos), {
headers: {
"Accept-Control-Allow-Origin": origin || "*",
"Content-Type": "application/json",
},
});
}
dan ubah file middleware.ts menjadi seperti ini
// middleware.ts
import { NextResponse } from "next/server";
const allowedOrigins =
process.env.NODE_ENv === "production"
? ["https://www.yoursite.com", "https://yoursite.com"]
: ["http://localhost:3000", "https://www.google.com"];
export function middleware(request: Request) {
const origin = request.headers.get("origin");
console.log(origin);
if ((origin && !allowedOrigins.includes(origin)) || !origin) {
return new NextResponse(null, {
status: 400,
statusText: "Bad Request",
headers: { "Content-Type": "text/plain" },
});
}
console.log("Middleware!");
console.log(request.url);
console.log(request.method);
return NextResponse.next();
}
export const config = {
matcher: "/api/:path*",
};
Comments
Post a Comment