Skip to content

Body Limit 中间间件

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

这个中间件首先使用请求中 Content-Length 头部的值(如果存在)。 如果未设置,它会读取流中的 body,并在其大于指定文件大小时执行错误处理程序。

导入

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}`) // 获取文件大小:${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() 将状态码设置为 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, // 此处填写您的值
})

在 MIT 许可证下发布。