💡

環境変数を取得したい!(Cloudflare Workers & Hono)

2023/03/07に公開5

はじめに

自分は最近Cloudflare Workersにはまっているんですが、どうも環境変数をトップレベルで取得する方法がないため、今回取得するためにどうすればいいかをちょっと考えてみました。

app.all()をうまく使う

要はリクエストが来る前に環境変数を使う操作を終わらせればいいんです。
例えば、MicroCMSとHonoを使いたい!となったら以下のようにすればいいんです。

import { Hono } from 'hono'
import { createClient } from 'microcms-js-sdk'

let client

let isAlreadyInited = false
const initAll = (c) => {
	if(!isAlreadyInited){
		isAlreadyInited = true
		client = createClient({
			serviceDomain: c.env.MICROCMS_SERVICE_DOMAIN,
			apiKey: c.env.MICROCMS_API_KEY
		})
	}
}

const app = new Hono()
app.all('*', async(c, next) => {
	initAll(c)
	await next()
})

/* ここにルーティングを記述 */

export default app

こうです。
また、リクエスト毎時初期化するのはパフォーマンス的に良くないのでこうするしか方法はないと思いました。
また、他の方法あったらぜひ教えてください。

終わりに

c.envには環境変数だけでなく、Workers KVやCloudflare D1の変数もあるので、うまく使うことがポイントです。

Discussion

yusukebeyusukebe

こんにちわ。

どのハンドラの中でも c.env.MICROCMS_SERVICE_DOMAINで取れます!
https://hono.dev/getting-started/cloudflare-workers#bindings

kstdxkstdx

コメントありがとうございます。

もし読み取り間違っていたらすいません。

app.use()
app.all()
app.get()
app.post()

などのハンドラでc.env.MICROCMS_SERVICE_DOMAINが取得可能ということでしょうか?
ですが、リクエスト毎時に環境変数を取得してクライアントを作成するのは色々良くないかなと思って、リクエストが来る前に一度初期設定をする形にしています。(値の共有という面ではc.set()のほうが良い気もします)

yusukebeyusukebe

などのハンドラでc.env.MICROCMS_SERVICE_DOMAINが取得可能ということでしょうか?

取れます!

リクエスト毎時に環境変数を取得してクライアントを作成するのは色々良くないかなと思って、リクエストが来る前に一度初期設定をする形にしています。

いいと思います!が、Cloudflare Workersの場合、アプリケーションは永続的ではないので、let clientとかlet isAlreadyInitedの値は保持されない、もしくはのちほど消えちゃいます!ちなみに c.set() はリクエストを受けてからレスポンスを返すまでがライフサイクルになります!

kstdxkstdx

ありがとうございます!

値が保持されない事は存じております。
が、テストしたところ一定時間は持ったので、この仕組みにしています。MicroCMSのSDKでは仕組み上パフォーマンスに顕著な違いは見られませんが、例えばDBのコネクション等をリクエスト毎に設定しているとかなりパフォーマンスに違いが出るかなと思って作成しました。もし間違っていればすいません🙇‍♀️

yusukebeyusukebe

いえいえ><

例えば、D1に関して言えば、c.env.DBとかでもうコネクションとれるので、Honoのアプリケーション側でコネクションの管理はしなくてよくなってました!KVもそんな感じです。なので、app.get()とかの中で直接c.env.DBで参照してます!