我使用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")
}
基于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.toml
。cargo.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
}
}