Lewati ke konten

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 /.

Pencocokan prefix Route-Specific: router.use('/api', fn) cocok dengan /api persis dan /api/users pada slash batas, tapi melewati /apiv2 dan /admin karena bukan kecocokan batas dari prefix

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:

Eksekusi Route-Specific untuk GET /api/users dalam satu rantai: logger global berjalan, auth /api berjalan pada kecocokan prefix, penjaga /admin dilewati karena tidak cocok tanpa memakai giliran, logger /api/users berjalan, lalu route handler dieksekusi, semua dalam urutan pendaftaran

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

Dirilis di bawah Lisensi MIT.