コンテンツへスキップ

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

オプション

必須 maxSize: number

制限したいファイルの最大ファイルサイズ。デフォルトは 100 * 1024 - 100kbです。

任意 onError: OnError

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

Bun での大きなリクエストの取り扱い

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

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ライセンスの下でリリースされています。