БэкендDevOpsJavaScript

Cloudflare Workers для новичка: публикуем JavaScript API без своего сервера

Создаём Worker через актуальный CLI, пишем GET и POST обработчик на Web API, запускаем локально и публикуем публичный JavaScript endpoint.

Кодик

Автор

6 мин чтения

Cloudflare Worker принимает Request и возвращает Response по публичному URL без настройки собственного VPS. Соберём маленький API заметок, запустим его через Wrangler, проверим GET и POST, затем разберём ограничения serverless-среды. Код использует стандартные Web API и не хранит данные между запросами.

Фраза «без сервера» скрывает платформу, деплой и ограничения runtime. Worker всё равно выполняется на серверной инфраструктуре, просто операционную систему обслуживает провайдер. В этой статье вы соберёте публичный JSON endpoint с двумя методами. Финальный результат можно проверить без догадок: wrangler dev отвечает локально, deploy выдаёт HTTPS URL, а неверный JSON возвращает 400 вместо падения.

1Создаём

create-cloudflare готовит Worker, конфигурацию Wrangler и локальные команды.

2Обрабатываем

fetch получает стандартный Request и возвращает Response.

3Публикуем

wrangler deploy собирает код и выдаёт адрес workers.dev или route.

Как запрос попадает в Cloudflare Worker

В модульном формате default export содержит async fetch. URL помогает выбрать путь, request.method разделяет GET и POST, а Response.json сериализует тело. Процесс не слушает порт и не вызывает app.listen. Для Cloudflare Workers держите этапы раздельно: ввод, проверка, основное действие и вывод. Такой маршрут позволяет остановиться в конкретной точке, увидеть фактические данные и исправить одну причину вместо случайной перестановки строк.

ЭтапДействиеПроверяемый результат
СозданиеC3 генерирует проект и wrangler.jsoncЕсть src/index.js
Локальноwrangler dev поднимает совместимый runtimeEndpoint доступен на localhost
Запросfetch получает RequestМетод и pathname прочитаны
Деплойwrangler deploy публикует bundleПолучен HTTPS URL

Один handler работает локально и на платформе, но только в рамках поддерживаемых Web API. У Cloudflare Workers каждый этап оставляет наблюдаемый след, поэтому следующий шаг начинается только после проверки предыдущего.

Путь запроса через Worker
От входных данных до видимого результата. Wrangler повторяет платформенный runtime

Не храните состояние в обычной переменной. Изолят может переиспользоваться или исчезнуть. Для постоянных заметок подключают KV, D1, Durable Objects или внешнюю базу и отдельно продумывают согласованность.

Пишем JavaScript API заметок

Установите актуальный Node.js и выполните npm create cloudflare@latest -- notes-worker. В мастере выберите Hello World example, Worker only и JavaScript, а первый deploy отложите. Перейдите в каталог и запустите npm run dev. Официальный CLI создаёт wrangler.jsonc и src/index.js. Авторизация потребуется только перед реальной публикацией.

const json = (data, status = 200) =>
  Response.json(data, {
    status,
    headers: { "cache-control": "no-store" },
  });

export default {
  async fetch(request) {
    const url = new URL(request.url);

    if (url.pathname !== "/api/note") {
      return json({ error: "route not found" }, 404);
    }

    if (request.method === "GET") {
      return json({ text: "Learn one Web API today" });
    }

    if (request.method === "POST") {
      let body;
      try {
        body = await request.json();
      } catch {
        return json({ error: "invalid JSON" }, 400);
      }

      if (typeof body.text !== "string" || !body.text.trim()) {
        return json({ error: "text is required" }, 400);
      }
      return json({ text: body.text.trim() }, 201);
    }

    return json({ error: "method not allowed" }, 405);
  },
};
Что должно произойти после запуска
  • GET /api/note отвечает JSON и no-store.
  • POST с text возвращает 201.
  • Сломанный JSON и пустой text возвращают 400.
  • Другой метод возвращает 405, другой путь 404.

Вспомогательная json-функция удерживает одинаковые заголовки и форму ответа, а handler остаётся читаемым. Пример Cloudflare Workers специально ограничен одним пользовательским сценарием, чтобы назначение каждой строки оставалось видимым.

Обычный сервер и edge handler
Что отличает устойчивый проект от случайного запуска. Без VPS не означает без инфраструктуры

Чем Worker отличается от Node.js сервера

Workers runtime построен на V8 и реализует многие Web Platform APIs. Request, Response, URL и fetch знакомы по браузеру. Node.js модули и файловая система доступны не так, как на обычном сервере, поэтому библиотеку нужно проверять на совместимость. Handler может выполняться рядом с пользователем, однако данные и внешние запросы имеют собственную географию. wrangler dev моделирует среду лучше, чем прямой node src/index.js.

ЧастьЗа что отвечаетЧто проверить
default exportРегистрирует события WorkerЕсть async fetch
RequestСодержит method, URL и bodyJSON читается один раз
ResponseНесёт status, headers и bodyФормат ошибок единый
WranglerРазрабатывает и публикуетКонфигурация лежит в проекте
StorageХранит постоянные данныеНе заменён глобальной переменной

Worker не гарантирует долгоживущий процесс. Инициализация модуля может переиспользоваться для нескольких запросов, но полагаться на это для данных нельзя. CPU time и лимиты зависят от тарифа и актуальных правил платформы. Для CORS добавляйте заголовки только под нужный origin и обрабатывайте OPTIONS. Секреты задаются через Wrangler secrets, а не wrangler.jsonc. Cache API полезен для идемпотентных GET, но POST-ответы обычно не кешируют.

Публичный URL является настоящей внешней точкой. Не публикуйте учебный endpoint с секретом, открытой записью в базу или дорогим внешним вызовом без авторизации и лимитов. Сначала проверяйте локально.

Проверяем методы, JSON и деплой

Запустите npm run dev и проверьте GET. Отправьте POST с корректным JSON, затем с пустой строкой и сломанным телом. Добавьте query-параметр uppercase=1, который меняет только представление GET. Напишите маленький test через Vitest или встроенный шаблон Workers. После локального успеха выполните npx wrangler deploy, сохраните URL и повторите четыре запроса. Затем удалите учебный Worker, если он больше не нужен.

Проверка своими руками
  1. Получите локальный GET 200.
  2. Отправьте POST и получите 201.
  3. Проверьте invalid JSON 400.
  4. Проверьте PUT 405.
  5. Добавьте один query-параметр.
  6. Повторите сценарии на deploy URL.
Готово, если выполняются все пункты
  • Локальный runtime отвечает.
  • Все статусы различаются.
  • Состояние не хранится в памяти.
  • Секреты отсутствуют в config.

Serverless упрощает сервер, но не отменяет контракт API, хранение данных и безопасность публичного адреса. После этой проверки измените одно правило Cloudflare Workers и заранее запишите ожидаемый результат. Так копирование превращается в понимание.

Четыре проверки serverless API
Четыре проверки перед следующим шагом. Публичный endpoint требует границ

Что учесть перед настоящим serverless API

Для постоянных заметок выберите хранилище по задаче и напишите миграцию данных. Добавьте аутентификацию до write-route, CORS для конкретного фронтенда и rate limit. Логи не должны содержать токены или полные персональные данные. Закрепляйте compatibility_date и обновляйте её после тестов, потому что runtime развивается. Для локального теста используйте Wrangler, а не предполагайте, что любой Node-пакет заработает на edge.

Как изучить тему в Кодике

Закрепите fetch, Request, Response, async/await и JSON в JavaScript, затем добавьте деплой как отдельный шаг. В Кодике сначала восстановите чистую логику без фреймворка, затем верните библиотеку и интерфейс Cloudflare Workers.

ШагЧто разобратьМини-проверка
1Web APIВернуть Response.json
2URL и methodРазвести GET и POST
3ОшибкиПоймать invalid JSON
4CLIЗапустить wrangler dev
5ServerlessОбъяснить отсутствие памяти между запросами

Если handler можно проверить обычным набором Request, платформа перестаёт быть чёрным ящиком. Финальная проверка для Cloudflare Workers: закрыть статью, объяснить путь данных и добавить одну функцию без копирования готового блока.

Вызывают app.listen

Worker экспортирует fetch и не открывает порт.

Хранят массив глобально

Используйте подходящее постоянное хранилище.

Пишут секрет в wrangler.jsonc

Задавайте секрет через защищённый механизм Wrangler.

Тестируют только успешный GET

Проверьте POST, invalid JSON, 404 и 405.

Сверяйтесь с первичной документацией. Команды и ограничения примера проверены по официальному руководству Cloudflare Workers CLI. Если версия инструмента изменилась, официальный источник важнее старого скриншота.

Что получится в итоге

Готовый результат проекта: Cloudflare Workers для новичка: публикуем JavaScript API без своего сервера
Один Worker обрабатывает GET и POST, возвращает ясные статусы и публикуется по HTTPS без ручной настройки VPS.

Короткие ответы
Нужен ли app.listen в Cloudflare Worker?

Нет, Worker экспортирует объект с fetch, а runtime сам передаёт ему Request.

Можно ли хранить заметки в глобальном массиве Worker?

Нет, память изолята не является постоянным хранилищем между запросами.

Чем проверять Worker локально?

Используйте Wrangler dev, потому что он запускает совместимую с платформой среду.

Как понять, что учебный проект Cloudflare Workers действительно работает?

Проверьте основной сценарий Cloudflare Workers, неверный ввод, повторный запуск и один граничный случай. Затем объясните путь данных своими словами.

Можно ли начать с готового кода Cloudflare Workers из статьи?

Да. Сначала добейтесь результата Cloudflare Workers, затем измените одно правило и восстановите ключевой файл без копирования.

Опубликуйте маленький endpoint, затем добавьте хранение

JavaScript и async закрепите в курсе JavaScript, а серверную архитектуру в профессии Backend.

Сравните маршрут с Express API, клиент с Fetch API и постоянное соединение с WebSocket-чатом.