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*",
};

Post a Comment (0)
Previous Post Next Post