Middleware Spesifik Rute
Middleware spesifik rute berlaku untuk pola rute tertentu, memungkinkan fungsi yang menyasar rute tertentu seperti autentikasi untuk rute API atau logging untuk rute admin.
Pencocokan sadar batas: router.use('/api', fn) berjalan untuk /api dan /api/users, tapi tidak untuk /apiv2, karena pathname harus sama dengan prefix atau dilanjut dengan /.

Penggunaan Dasar
Terapkan middleware ke pola rute tertentu memakai method use() dengan path rute:
typescript
import { Router } from '@neabyte/deserve'
const router = new Router()
// Berjalan untuk path yang diawali /api
router.use('/api', async (ctx, next) => {
console.log(`API request: ${ctx.get.method()} ${ctx.get.pathname()}`)
return await next()
})
await router.serve(8000)Pencocokan Pola Rute
Middleware berlaku untuk rute yang diawali pola yang ditentukan:
typescript
// Berlaku untuk rute /api/*
router.use('/api', middleware)
// Berlaku untuk rute /api/users/*
router.use('/api/users', middleware)
// Berlaku untuk rute /admin/*
router.use('/admin', middleware)Pola Spesifik Rute Umum
Autentikasi API
typescript
// Wajibkan bearer token di bawah /api
router.use('/api', async (ctx, next) => {
const authHeader = ctx.get.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
// Izinkan hanya peran admin di bawah /admin
router.use('/admin', async (ctx, next) => {
const userRole = ctx.get.header('x-user-role')
if (userRole !== 'admin') {
return ctx.send.text('Admin access required', { status: 403 })
}
return await next()
})Logging Rute Publik
typescript
// Catat akses di bawah /public
router.use('/public', async (ctx, next) => {
console.log(`Public access: ${ctx.get.method()} ${ctx.get.pathname()}`)
return await next()
})Middleware Spesifik Versi
typescript
// Middleware terpisah 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()
})Banyak Middleware Spesifik Rute
Terapkan beberapa middleware ke pola rute yang sama:
typescript
// Auth berjalan lebih dulu di bawah /api
router.use('/api', async (ctx, next) => {
const authHeader = ctx.get.header('authorization')
if (!authHeader) {
return ctx.send.text('Unauthorized', { status: 401 })
}
return await next()
})
// Logging berjalan setelah auth lolos
router.use('/api', async (ctx, next) => {
console.log(`API: ${ctx.get.method()} ${ctx.get.pathname()}`)
return await next()
})Pola Rute Bersarang
Terapkan middleware ke pola rute bersarang:
typescript
// Mencakup setiap path di bawah /api
router.use('/api', async (ctx, next) => {
console.log('API request')
return await next()
})
// Mempersempit ke /api/users
router.use('/api/users', async (ctx, next) => {
console.log('User API request')
return await next()
})
// Mempersempit lagi dan cek peran
router.use('/api/users/admin', async (ctx, next) => {
const role = ctx.get.header('x-user-role')
if (role !== 'admin') {
return ctx.send.text('Admin access required', { status: 403 })
}
return await next()
})Urutan Eksekusi Middleware
Middleware berjalan sesuai urutan penambahannya:

typescript
// Global berjalan untuk setiap request
router.use(async (ctx, next) => {
console.log('Global middleware')
return await next()
})
// Middleware path berjalan untuk request /api
router.use('/api', async (ctx, next) => {
console.log('API middleware')
return await next()
})
// Untuk /api/users: global, lalu API, lalu handler