🤖

Firebase Functions でHonoをwebサーバとして使う

2023/12/24に公開

Firebase functionsでwebサーバ、apiサーバを立てる場合、expressを使うことが多いと思います。Honoは軽量でパワフル、導入が用意なwebフレームワークです。expressのかわりのhonoを使ってみたいと思います。

honoは Cloudflare Workers, AWS Lambda, Lambda@Edgeなどで使うためのadapterが用意されています。そのadapterを参考にすれば他の環境で動作させることが可能となります。

今回は、lambda-edgeのhandler.tsを参考に、firebase functionsの対応をしました。基本はrequestを変換しRequestをhono.fetchに渡し、返ってきたresponseを環境に合わせて変換すればよさそうです。

出来上がったものはこちら

import { Hono } from "hono";
import { Request as FunctionRequest, Response } from "firebase-functions";

// eslint-disable-next-line @typescript-eslint/no-explicit-any
const handle = (app: Hono<any>) => {
  return async (req: FunctionRequest, resp: Response) => {
    const url = new URL(`${req.protocol}://${req.hostname}${req.url}`);

    const headers = new Headers()

    Object.keys(req.headers).forEach((k) => {
      headers.set(k, req.headers[k] as string);
    })
    const body = req.body;

    const newRequest = ["GET", "HEAD"].includes(req.method) ? new Request(url, {
      headers,
      method: req.method,
    }) : new Request(url, {
      headers,
      method: req.method,
      body: Buffer.from((typeof body === "string") ? body : JSON.stringify(body || {})),
    }) 
    const res = await app.fetch(newRequest);
    resp.json(await res.json());
  };
};

const app = new Hono();

app.get("/api/test", (c) => c.json({message: "Hono!"}));

export const server = handle(app);

デプロイ後webページにリクエストすると

{"message":"Hono!"}

と返ってきました。

この記事によれば

Hono[炎] と名付けました。Cloud「flare」

とありますが、「Fire」baseとも相性が良いようです。

シンギュラリティ・ソサエティ

Discussion