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



我使用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.tomlcargo.toml在这种情况下毫无意义,因为它不是一个生锈的项目。

一旦您将配置文件重命名为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
}
}

相关内容

  • 没有找到相关文章

最新更新