🤖

Cloudflare WorkerのKV Bindingsがundefinedになる

2024/07/18に公開

急にKVのBindingsがundefinedになって、原因わからず困ってた。

TL;DR

wrangler.toml
kv_namespaces = [
  { ... }
]

の形式で書く時は、[vars]等よりも上に書くこと。vars扱いになってしまう。
https://github.com/honojs/hono/issues/1218

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_namespacesvarsのキーと判定されてしまうためです。
JSONに書き直すと、

{
  "vars" : {
    "kv_namespaces" : [
       { ... }
    ]
  }
}

こうなっているって事ですね。

https://github.com/honojs/hono/issues/1218
上記Issueを参考に、

kv_namespace = [
  { ... }
]

[vars]

の順にするとうまくいきました。

そもそもtomlの書き方が分かっていなかったので調べたところ、

[[kv_namespaces]]
binding = "EXAMPLE_KV"
id = "test"

[[kv_namespaces]]
binding = "EXAMPLE2_KV"
id = "test2"

こう書けばテーブルに要素を加える事ができるそうです。
これが正解でしょうね。

Discussion