💡
環境変数を取得したい!(Cloudflare Workers & Hono)
はじめに
自分は最近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
こんにちわ。
どのハンドラの中でも
c.env.MICROCMS_SERVICE_DOMAIN
で取れます!コメントありがとうございます。
もし読み取り間違っていたらすいません。
などのハンドラで
c.env.MICROCMS_SERVICE_DOMAIN
が取得可能ということでしょうか?ですが、リクエスト毎時に環境変数を取得してクライアントを作成するのは色々良くないかなと思って、リクエストが来る前に一度初期設定をする形にしています。(値の共有という面では
c.set()
のほうが良い気もします)取れます!
いいと思います!が、Cloudflare Workersの場合、アプリケーションは永続的ではないので、
let client
とかlet isAlreadyInited
の値は保持されない、もしくはのちほど消えちゃいます!ちなみにc.set()
はリクエストを受けてからレスポンスを返すまでがライフサイクルになります!ありがとうございます!
値が保持されない事は存じております。
が、テストしたところ一定時間は持ったので、この仕組みにしています。MicroCMSのSDKでは仕組み上パフォーマンスに顕著な違いは見られませんが、例えばDBのコネクション等をリクエスト毎に設定しているとかなりパフォーマンスに違いが出るかなと思って作成しました。もし間違っていればすいません🙇♀️
いえいえ><
例えば、D1に関して言えば、
c.env.DB
とかでもうコネクションとれるので、Honoのアプリケーション側でコネクションの管理はしなくてよくなってました!KVもそんな感じです。なので、app.get()
とかの中で直接c.env.DB
で参照してます!