Я использую пространство имен KV, определенное в cargo.toml
, добавляя к нему строки
kv_namespaces = [
{ binding = "SITE_DATA", id = "<test-site-id>" }
]
Когда я пытаюсь импортировать переменную SITE_DATA
в свой сценарий Worker, как показано, и запускаю 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)
?
источник/обработчики/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
ничего не значит в этом контексте, учитывая, что это не ржавый проект.
как только вы переименовали свой файл конфигурации в 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
}
}