本文へ移動

Body Limit ミドルウェア ​

Body Limit ミドルウェアは、リクエストボディのファイルサイズを制限できます。

リクエストに Content-Length ヘッダーがあれば、まずその値を使用します。 設定されていなければ、ストリームからボディを読み取り、指定されたファイルサイズを超えた場合にエラーハンドラーを実行します。

インポート ​

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 :)')
  }
)

オプション ​

required maxSize: number ​

制限する最大ファイルサイズ。デフォルトは 100 * 1024、つまり 100kb です。

optional onError: OnError ​

指定されたファイルサイズを超えた場合に呼び出すエラーハンドラー。

Bun で大きなリクエストを扱う場合 ​

Body Limit ミドルウェアで、デフォルトより大きなリクエストボディを明示的に許可する場合は、Bun.serve の設定も合わせて変更する必要があるかもしれません。執筆時点で、Bun.serve のリクエストボディのデフォルト上限は 128MiB です。Hono の Body Limit ミドルウェアにそれより大きな値を設定しても、リクエストは失敗し、ミドルウェアの onError ハンドラーも呼ばれません。Bun.serve() が Hono にリクエストを渡す前にステータスコードを 413 にして接続を終了するためです。

Hono と Bun で 128MiB を超えるリクエストを受け付けるには、Bun 側の上限も設定します。

ts
export default {
  port: process.env['PORT'] || 3000,
  fetch: app.fetch,
  maxRequestBodySize: 1024 * 1024 * 200, // your value here
}

または、構成に応じて次のようにします。

ts
Bun.serve({
  fetch(req, server) {
    return app.fetch(req, { ip: server.requestIP(req) })
  },
  maxRequestBodySize: 1024 * 1024 * 200, // your value here
})

MIT ライセンスで公開されています。