跳转到正文

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 许可证发布。