2023-12-25

honoのテストケースで環境変数を利用する

javascript

honoでCloudFlare Workers上で動作する認証機構を書き始めた。 honoのセットアップは非常に簡単でものの数分でwranglerの開発環境が手に入った。 一方でE2Eのテストケースを書こうとした際にテスト用の環境変数を渡す方法がわからず戸惑ったのでメモ。

結論

app.fetch()の第2引数や、app.request()の第3引数に環境変数を渡すことができる。 以下app.request()を利用した場合の例。

typescript
Copied!
const env: EnvironmentVariables = {
	KEY1: "VALUE1",
	KEY2: "VALUE2",
};

const app = new Hono();
app.get("/{path}", handler);
const request = new Request(`https://{hostname}/{path}`,);
const res = await app.request(request, undefined, env);

実装調査

honoのドキュメントは使い方が網羅的に記載されているが、まだ新しいライブラリなので詳細が書かれているわけではない。 必要に応じてソースコードを読んでいく必要がある。

CloudFlare Workersでfetchイベントが発生した場合には、index.jsでdefault exportしたオブジェクトに存在するfetch関数が呼び出される(設定次第ではあるが)。 Honoオブジェクトにはfetchメソッドが存在しているため、リクエストを受け取った場合にはこの関数がエントリーポイントになると思われる。 CloudFlare Workersはこのfetchメソッドに適切に環境変数を渡してくれるので、本番環境やwrangler上では適切に環境変数を扱うことができるという設計のようだ。

以下は実際のhonoのソースコードからの引用。型回りは自信が無いがおそらくEnvの型はデフォルトでRecord<string, unknown> | {}と等しくなるはず。 requestなどの関数もfetch関数の周囲に実装されているので、第2引数が何かなどについて気になる人はそちらを参照するのがよさそう。

typescript
Copied!
fetch = (request: Request, Env?: E['Bindings'] | {}, executionCtx?: ExecutionContext) => {
  return this.dispatch(request, executionCtx, Env, request.method)
}