如何导入 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 publish
或 wrangler 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")
}
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
}
}
我正在使用 cargo.toml
中定义的 KV 命名空间,方法是向其中添加行
kv_namespaces = [
{ binding = "SITE_DATA", id = "<test-site-id>" }
]
当我尝试在我的 Worker 脚本中导入 SITE_DATA
变量时,我 运行 wrangler publish
或 wrangler 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")
}
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
}
}