🤖
Cloudflare WorkerのKV Bindingsがundefinedになる
急にKVのBindingsがundefinedになって、原因わからず困ってた。
TL;DR
wrangler.toml
kv_namespaces = [
{ ... }
]
の形式で書く時は、[vars]
等よりも上に書くこと。vars扱いになってしまう。
Environment VariablesのBindingのしかた
global.d.ts
declare module 'hono' {
interface Env {
Bindings: {
DATABASE_URL: string;
ADMIN_USERNAME: string;
ADMIN_PASSWORD: string;
// Key-Value Store
INSTANCES_KV: KVNamespace;
// Durable Objects
PARTY: DurableObjectNamespace<PartyDurableObject>;
} & VerifyFirebaseAuthEnv;
Variables: {
firebaseUser: FirebaseUser;
};
}
}
Hono
導入前提ですが、こんな感じでHonoに型付けをします。
すると、new Hono()
やnew openAPIHono()
、createMiddleware()
等にも同様の型が付きます。
Honoとは関係のないDurableObjectのEnvにも型が付くので大変ありがたいですね。
公式ドキュメントでは、new Hono<Env>()
と渡すように書いてあるので毎回面倒だなと思っていましたが、honox
のドキュメントを見ていると上記の方法で型付けしていて嬉しい発見でした。
ちなみにHonoとは無関係ながら、DurableObjectのコンストラクタで
import { Env } from "hono";
class Example extends DurableObject {
constructor(private readonly state, readonly env: Env["Bindings"]){
super(state, env);
}
}
こうやって無理やり型を付けることができます。
kv_namespacesを書き換えた
デフォルトのwrangler.toml
では、
[vars]
EXAMPLE=
[[kv_namespaces]]
bindings = ""
id = ""
という順番で書かれています。
2つ目のKV Bindingsを入れようとして、同じ個所のまま
kv_namespaces = [
{ ... }
]
と書き換えて、あれバインドされないな…となりました。
そもそもtomlの書き方がわかってない問題
これは、kv_namespaces
がvars
のキーと判定されてしまうためです。
JSONに書き直すと、
{
"vars" : {
"kv_namespaces" : [
{ ... }
]
}
}
こうなっているって事ですね。
上記Issueを参考に、
kv_namespace = [
{ ... }
]
[vars]
の順にするとうまくいきました。
そもそもtomlの書き方が分かっていなかったので調べたところ、
[[kv_namespaces]]
binding = "EXAMPLE_KV"
id = "test"
[[kv_namespaces]]
binding = "EXAMPLE2_KV"
id = "test2"
こう書けばテーブルに要素を加える事ができるそうです。
これが正解でしょうね。
Discussion