Skip to content

Body Limit 中间件

Body Limit 中间件可以限制请求正文(Body)的大小。

该中间件会优先读取请求中的 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, // 在此填入你的值
}

或者根据你的项目结构:

ts
Bun.serve({
  fetch(req, server) {
    return app.fetch(req, { ip: server.requestIP(req) })
  },
  maxRequestBodySize: 1024 * 1024 * 200, // 在此填入你的值
})

Released under the MIT License.