Skip to content

Body Limit Middleware

Body Limit Middleware는 요청 본문의 파일 크기를 제한한다.

이 미들웨어는 먼저 요청에 Content-Length 헤더가 있는 경우 그 값을 사용한다. 헤더가 설정되지 않았다면 스트림에서 본문을 읽고, 지정된 파일 크기보다 큰 경우 에러 핸들러를 실행한다.

Import

ts
import { Hono } from 'hono'
import { bodyLimit } from 'hono/body-limit'

사용법

ts
const app = new Hono()

app.post(
  '/upload',
  bodyLimit({
    maxSize: 50 * 1024, // 50kb
    onError: (c) => {
      return c.text('overflow :(', 413)
    },
  }),
  async (c) => {
    const body = await c.req.parseBody()
    if (body['file'] instanceof File) {
      console.log(`Got file sized: ${body['file'].size}`)
    }
    return c.text('pass :)')
  }
)

옵션

필수 maxSize: number

파일 크기를 제한할 최대 값을 설정한다. 기본값은 100 * 1024 - 100kb이다.

optional onError: OnError

지정된 파일 크기를 초과할 경우 호출될 에러 핸들러를 설정한다.

Bun에서 대용량 요청 처리하기

Body Limit Middleware를 명시적으로 사용해 기본값보다 큰 요청 본문을 허용하려면, Bun.serve 설정도 이에 맞게 변경해야 한다. 작성 시점 기준으로, Bun.serve의 기본 요청 본문 크기 제한은 128MiB이다. Hono의 Body Limit Middleware를 이보다 큰 값으로 설정하더라도 요청은 실패하며, 미들웨어에 지정된 onError 핸들러도 호출되지 않는다. 이는 Bun.serve()가 상태 코드를 413으로 설정하고 요청을 Hono로 전달하기 전에 연결을 종료하기 때문이다.

Hono와 Bun을 사용해 128MiB보다 큰 요청을 허용하려면, Bun의 제한도 함께 설정해야 한다:

ts
export default {
  port: process.env['PORT'] || 3000,
  fetch: app.fetch,
  maxRequestBodySize: 1024 * 1024 * 200, // 여기에 원하는 값을 설정한다
}

또는 설정에 따라 다음과 같이 할 수도 있다:

ts
Bun.serve({
  fetch(req, server) {
    return app.fetch(req, { ip: server.requestIP(req) })
  },
  maxRequestBodySize: 1024 * 1024 * 200, // 여기에 원하는 값을 설정한다
})

Released under the MIT License.