Как импортировать переменную пространства имен Cloudflare KV?

Я использую пространство имен 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")
}

На основе 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"]
}
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
15
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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
   }
}

Другие вопросы по теме