Middleware Body Limit
Referensi: RFC 7230 HTTP/1.1 Message Syntax and Routing
Middleware Body Limit menegakkan ukuran body request maksimum. Jika body ada, stream body selalu dibungkus dengan limiter sehingga ukuran ditegakkan terlepas dari header. Mencegah payload besar yang dapat membebani server Anda.
Penggunaan Dasar
Terapkan middleware body limit menggunakan middleware built-in Deserve:
// 1. Import Router dan Mware
import { Router, Mware } from '@neabyte/deserve'
// 2. Buat router
const router = new Router()
// 3. Batasi body request maks 1MB; jika lebih → 413
router.use(
Mware.bodyLimit({
limit: 1024 * 1024
})
)
// 4. Jalankan server
await router.serve(8000)Limit Per Rute
Terapkan limit body berbeda pada route tertentu:
// 1. Global: max 1MB
router.use(Mware.bodyLimit({ limit: 1024 * 1024 }))
// 2. Hanya /uploads: max 5MB
router.use('/uploads', Mware.bodyLimit({ limit: 5 * 1024 * 1024 }))
// 3. Hanya /api: max 10MB
router.use('/api', Mware.bodyLimit({ limit: 10 * 1024 * 1024 }))Opsi Konfigurasi
limit
Ukuran body maksimum dalam bytes:
// 1MB (1,048,576 bytes)
limit: 1024 * 1024
// 5MB (5,242,880 bytes)
limit: 5 * 1024 * 1024
// 10MB (10,485,760 bytes)
limit: 10 * 1024 * 1024Cara Kerja Body Limit
Jika request punya body, middleware membungkus stream body dengan byte limiter sehingga ukuran ditegakkan saat body dibaca (bukan hanya lewat header):
- GET/HEAD atau tanpa body - Tidak dibungkus; request dilewati.
- Body ada - Stream body selalu dibungkus dengan limiter. Jika klien mengirim byte lebih dari
limit, pembacaan dihentikan dan middleware merespons 413 Request Entity Too Large. - Content-Length - Jika ada dan di atas
limit, middleware bisa menolak request sebelum membaca body (early reject).
RFC 7230
- Jika
Transfer-EncodingdanContent-Lengthkeduanya ada,Transfer-Encodingdiutamakan. - Body chunked atau ukuran tidak diketahui tetap dibatasi oleh stream yang dibungkus; hanya byte yang dibaca yang dihitung ke limit.
Contoh Lengkap
// 1. Import Router dan Mware
import { Router, Mware } from '@neabyte/deserve'
// 2. Buat router
const router = new Router({ routesDir: './routes' })
// 3. Limit global 1MB
router.use(Mware.bodyLimit({ limit: 1024 * 1024 }))
// 4. Per-path: /uploads 5MB, /api 10MB
router.use('/uploads', Mware.bodyLimit({ limit: 5 * 1024 * 1024 }))
router.use('/api', Mware.bodyLimit({ limit: 10 * 1024 * 1024 }))
// 5. Jalankan server
await router.serve(8000)Penanganan Error
Body Limit secara otomatis menggunakan router.catch() jika didefinisikan:
// 1. Tangkap 413 (payload too large) dan error lain
router.catch((ctx, { statusCode, error }) => {
if (statusCode === 413) {
return ctx.send.json(
{ error: 'Request entity too large', message: error?.message },
{ status: 413 }
)
}
return ctx.send.json(
{
error: error?.message ?? 'Error tidak diketahui'
},
{ status: statusCode }
)
})
// 2. Pasang body limit (akan pakai router.catch di atas)
router.use(Mware.bodyLimit({ limit: 1024 * 1024 }))Ketika limit terlampaui, middleware mengembalikan pesan Request entity too large dengan status code: 413 sebelum body request dibaca.