この記事はHono Advent Calendar 2025の2日目の記事です。
はじめに
皆さんはHonoのMiddlewareを書いたことがありますか?
HonoのドキュメントのCustom Middlewareから引用しますが、HonoのMiddlewareは非常にシンプルな仕組みで、以下のように app.use() に渡したコールバック関数内の、 await next() 呼び出しの前後でContextに対して処理を行うことができます。
// Custom logger app.use(async (c, next) => { console.log(`[${c.req.method}] ${c.req.url}`) // ↑次のMiddleware / Handlerの処理の前に実行 await next() }) // Add a custom header app.use('/message/*', async (c, next) => { await next() // ↓前のMiddleware / Handlerの処理の後に実行 c.header('x-message', 'This is middleware!') })
以下はHonoのドキュメントのModify the Response After Nextの例ですが、このように、Handlerが返したResponseをMiddlewareで上書きすることもできてしまいます。
const stripRes = createMiddleware(async (c, next) => { await next() c.res = undefined // Responseを上書き c.res = new Response('New Response') })
このように、HonoのMiddlewareは、リクエスト / レスポンスの処理に介入して好きに加工を行える、大きな柔軟性を持っています。パッと見ただけでも、これなら何でもできそう!という印象になると思います。
ですが、ちょっと待ってください。
何でもできそうといっても、これはTypeScript / JavaScriptで書ける範囲なら何でもできそうという話のようにも見えます。
人によっては、Goの豊富なライブラリを使ってHonoのMiddlewareを書きたいことがあるかもしれないですよね!
そんなあなたのために、hono-middleware-goを紹介します!
続きを読む