如何导入 Cloudflare KV 命名空间变量?

How to import Cloudflare KV Namespace Variable?

我正在使用 cargo.toml 中定义的 KV 命名空间,方法是向其中添加行

kv_namespaces = [
  { binding = "SITE_DATA", id = "<test-site-id>" }
]

当我尝试在我的 Worker 脚本中导入 SITE_DATA 变量时,我 运行 wrangler publishwrangler build,我得到错误

[tsl] ERROR in /home/x/test/src/handlers/foo.ts(1,29)
      TS2306: File '/home/x/test/node_modules/@cloudflare/workers-types/index.d.ts' is not a module.
ts-loader-default_e3b0c44298fc1c14

为什么会发生此错误,我们如何正确导入 SITE_DATA 以便我们可以执行类似 SITE_DATA.put("data", data) 的操作?

src/handlers/foo.ts

import { KVNamespace } from '@cloudflare/workers-types'

declare const SITE_DATA: KVNamespace

export const Foo = async () => {
  const data = {
    title: 'Hello World',
  }
  SITE_DATA.put('posts', JSON.stringify(data))

  return new Response("ok")
}

基于https://levelup.gitconnected.com/create-a-api-on-the-edge-using-typescript-and-cloudflare-workers-e71fea7fc1b6

tsconfig.json

{
  "compilerOptions": {
    "outDir": "./dist",
    "module": "commonjs",
    "target": "esnext",
    "lib": ["esnext"],
    "alwaysStrict": true,
    "strict": true,
    "preserveConstEnums": true,
    "moduleResolution": "node",
    "sourceMap": true,
    "esModuleInterop": true,
    "types": [
      "@cloudflare/workers-types",
      "@types/jest",
      "@types/service-worker-mock"
    ]
  },
  "include": ["src"],
  "exclude": ["node_modules", "dist", "test"]
}

Wrangler 会寻找 wrangler.toml,除非另有说明。 cargo.toml 在这种情况下没有任何意义,因为它不是 rust 项目。

一旦你将你的配置文件重命名为 wrangler.toml(或者修改你的构建脚本以指向 cargo.toml,尽管有最小惊讶原则)你需要声明你的全局变量环境模块 src/bindings.d.ts

declare global  {
    const WHATEVER: string;
    const SITE_DATA: KVNamespace;
}

您不应显式导入工人类型。将它放在 tsconfig 上已经可以让您的 IDE 利用这些定义了。

在模块格式中,工作人员不会将您的绑定放在全局范围内。它们将作为 env 参数的属性出现。没有环境声明到期。

export default  {
   fetch:(request, env, ctx) {
       // Here, env.SITE_DATA  is a KVNamespace
   }
}