跳至內容

Body 限制中介軟體

Body 限制中介軟體可以限制請求 body 的檔案大小。

此中介軟體首先使用請求中 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}`)
    }
    return c.text('pass :)')
  }
)

選項

必要 maxSize: number

您要限制的最大檔案大小。預設值為 100 * 1024 - 100kb

選用 onError: OnError

如果超過指定檔案大小要調用的錯誤處理程式。

在 Bun 中使用 Body 限制中介軟體處理大型請求

如果明確使用 Body 限制中介軟體來允許大於預設值的請求 body,則可能需要相應地更改 Bun.serve 的設定。 在撰寫本文時Bun.serve 的預設請求 body 限制為 128MiB。 如果您將 Hono 的 Body 限制中介軟體設定為大於此值,您的請求仍然會失敗,並且此外,將不會呼叫中介軟體中指定的 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 授權發布。