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, // 在此填入你的值
})