Lewati ke konten

Middleware Spesifik Rute

Middleware spesifik rute diterapkan hanya ke request yang path-nya diawali dengan string yang Anda berikan (prefix match). Misalnya router.use('/api', mw) menjalankan mw untuk /api, /api/users, /api/v1, dan seterusnya. memungkinkan fungsi bertarget seperti autentikasi untuk API routes atau logging untuk admin routes.

Penggunaan Dasar

Terapkan middleware ke pola rute spesifik menggunakan method use() dengan path rute:

typescript
// 1. Import Router
import { Router } from '@neabyte/deserve'

// 2. Buat router
const router = new Router()

// 3. Pasang middleware untuk path yang diawali /api (prefix match)
router.use('/api', async (ctx, next) => {
  console.log(`API request: ${ctx.request.method} ${ctx.url}`)
  return await next()
})

// 4. Jalankan server
await router.serve(8000)

Pencocokan Pola Rute

Middleware berlaku untuk routes yang dimulai dengan pola yang ditentukan:

typescript
// 1. Prefix path = scope middleware (prefix match)
router.use('/api', middleware)
router.use('/api/users', middleware)
router.use('/admin', middleware)

Pola Umum Middleware Per Rute

Autentikasi API

typescript
// 1. Auth hanya untuk /api
router.use('/api', async (ctx, next) => {
  const authHeader = ctx.header('authorization')
  if (!authHeader) {
    return ctx.send.text('API requires authentication', { status: 401 })
  }
  const token = authHeader.replace('Bearer ', '')
  if (!isValidToken(token)) {
    return ctx.send.text('Invalid token', { status: 401 })
  }
  return await next()
})

Otorisasi Admin

typescript
// 1. Cek role admin untuk /admin
router.use('/admin', async (ctx, next) => {
  const userRole = ctx.header('x-user-role')
  if (userRole !== 'admin') {
    return ctx.send.text('Admin access required', { status: 403 })
  }
  return await next()
})

Logging Rute Publik

typescript
// 1. Log akses ke /public
router.use('/public', async (ctx, next) => {
  console.log(`Public access: ${ctx.request.method} ${ctx.url}`)
  return await next()
})

Middleware Per Versi

typescript
// 1. Middleware per versi API
router.use('/api/v1', async (ctx, next) => {
  console.log('Legacy API v1 request')
  return await next()
})

router.use('/api/v2', async (ctx, next) => {
  console.log('Modern API v2 request')
  return await next()
})

Beberapa Middleware Untuk Path Yang Sama

Terapkan beberapa middleware ke pola rute yang sama:

typescript
// 1. Auth dulu untuk /api
router.use('/api', async (ctx, next) => {
  const authHeader = ctx.header('authorization')
  if (!authHeader) {
    return ctx.send.text('Unauthorized', { status: 401 })
  }
  return await next()
})

// 2. Lalu logging (jalan setelah auth ok)
router.use('/api', async (ctx, next) => {
  console.log(`API: ${ctx.request.method} ${ctx.url}`)
  return await next()
})

Pola Rute Bersarang

Terapkan middleware ke pola rute bersarang:

typescript
// 1. /api → semua path di bawah /api
router.use('/api', async (ctx, next) => {
  console.log('API request')
  return await next()
})

// 2. /api/users → lebih spesifik
router.use('/api/users', async (ctx, next) => {
  console.log('User API request')
  return await next()
})

// 3. /api/users/admin → cek role
router.use('/api/users/admin', async (ctx, next) => {
  const role = ctx.header('x-user-role')
  if (role !== 'admin') {
    return ctx.send.text('Admin access required', { status: 403 })
  }
  return await next()
})

Urutan Eksekusi Middleware

Middleware dieksekusi sesuai urutan penambahannya:

typescript
// 1. Global: jalan untuk semua request
router.use(async (ctx, next) => {
  console.log('Global middleware')
  return await next()
})

// 2. Path /api: jalan jika path diawali /api
router.use('/api', async (ctx, next) => {
  console.log('API middleware')
  return await next()
})

// Urutan eksekusi untuk request ke /api/users:
// 1. Global middleware (ditambahkan pertama)
// 2. API middleware (route-specific, ditambahkan kedua)
// 3. Route handler

Dirilis di bawah Lisensi MIT.