Skip to content

Ошибки и их решения

Каталог известных ошибок с решениями. Используй Ctrl+F для поиска по тексту ошибки.


Build & TypeScript

Missing entry-point to Worker script

Сообщение:

✘ [ERROR] Missing entry-point to Worker script or to assets directory

Причина: В wrangler.toml отсутствует поле main.

Решение:

bash
# Проверь wrangler.toml
cat workers/gateway/wrangler.toml | grep main

# Должно быть:
main = "src/index.ts"

Контекст: Возникает при pnpm build или wrangler deploy если wrangler.toml не сгенерирован.


Cannot find module '@happ-integ/...'

Сообщение:

error TS2307: Cannot find module '@happ-integ/db' or its corresponding type declarations.

Причина: Пакет не собран или не установлен.

Решение:

bash
# 1. Установи зависимости
pnpm install

# 2. Собери все пакеты
pnpm build

# 3. Если не помогло - очисти кэш
rm -rf node_modules/.cache
pnpm install

Type 'X' is not assignable to type 'Y'

Сообщение:

error TS2345: Argument of type 'X' is not assignable to parameter of type 'Y'.

Причина: Несовпадение типов, часто после изменения интерфейсов.

Решение:

  1. Проверь что импортируешь правильный тип из types.ts
  2. Убедись что payload соответствует интерфейсу
  3. Пересобери пакеты: pnpm build

Unused variable/import

Сообщение:

error @typescript-eslint/no-unused-vars: 'xxx' is defined but never used

Причина: ESLint обнаружил неиспользуемую переменную.

Решение:

bash
# Автофикс
pnpm lint:fix

# Или удали переменную вручную

Deploy & Cloudflare

Service binding not found

Сообщение:

✘ [ERROR] Service "integ-xxx" not found

Причина: Worker интеграции не задеплоен, но указан в service bindings gateway.

Решение:

bash
# 1. Задеплой интеграцию сначала
pnpm deploy:dev --filter=xxx

# 2. Потом gateway
pnpm deploy:dev --filter=integ-gateway

Контекст: CI/CD деплоит интеграции перед gateway автоматически.


D1 database not found

Сообщение:

✘ [ERROR] D1 database 'integ-db' does not exist

Причина: База данных не создана в Cloudflare.

Решение:

bash
# Для dev окружения
wrangler d1 create integ-db --env dev

# Обнови database_id в wrangler.toml

KV namespace not found

Сообщение:

✘ [ERROR] KV namespace 'integ-kv' not found

Причина: KV namespace не создан.

Решение:

bash
# Создай namespace
wrangler kv:namespace create integ-kv --env dev

# Обнови namespace_id в wrangler.toml

Secret not found

Сообщение:

Error: Secret CRYPTO_KEY not found

Причина: Секрет не синхронизирован с Cloudflare.

Решение:

bash
# Синхронизируй секреты из Doppler
pnpm sync-secrets:dev

# Или вручную
wrangler secret put CRYPTO_KEY --env dev

Too many redirects (ERR_TOO_MANY_REDIRECTS)

Сообщение:

Too many redirects
# или в логах:
Unexpected redirect 301 to https://...

Пример: Запрос к https://prod.ua.happ.tools/api/sips/298/originate/ возвращает бесконечные редиректы.

Причина: Настройка Cloudflare SSL/TLS → Flexible. При Flexible режиме:

  1. Cloudflare принимает HTTPS от клиента
  2. Cloudflare отправляет HTTP на origin сервер
  3. Origin сервер (Django/nginx) видит HTTP и редиректит на HTTPS
  4. Cloudflare снова отправляет HTTP → бесконечный цикл

Решение:

  1. Открой Cloudflare Dashboard → домен (например happ.tools)
  2. SSL/TLS → Overview
  3. Измени режим с Flexible на Full или Full (strict)
Flexible (❌ проблема):
  Client --HTTPS--> Cloudflare --HTTP--> Origin --301 HTTPS--> loop

Full (✅ решение):
  Client --HTTPS--> Cloudflare --HTTPS--> Origin --200 OK-->

Важно: Это НЕ проблема кода. Не нужно добавлять:

  • redirect: "manual" в fetch
  • User-Agent headers
  • Ручную обработку редиректов

Контекст: Ошибка возникала при вызове Voice Assistant API из Cloudflare Workers. После смены SSL на Full — работает без изменений в коде.


Runtime & D1

Cannot read properties of undefined (reading 'duration')

Сообщение:

TypeError: Cannot read properties of undefined (reading 'duration')
    at aggregateD1Meta (cloudflare-internal:d1-api:482:41)

Причина: Баг в wrangler/miniflare — метод d1.exec() вызывает ошибку во внутренней функции aggregateD1Meta при работе с D1.

Решение: Использовать d1.prepare().run() вместо d1.exec():

typescript
// ❌ Вызывает ошибку
await d1.exec("CREATE TABLE IF NOT EXISTS ...");

// ✅ Работает корректно
await d1.prepare("CREATE TABLE IF NOT EXISTS ...").run();

Контекст: Ошибка возникает в локальном dev окружении (wrangler dev). В production обычно не проявляется. Исправлено в packages/core/src/migrations.ts.


D1_ERROR: no such table

Сообщение:

D1_ERROR: no such table: sofa_calls

Причина: Миграции не выполнены.

Решение:

Миграции применяются через код при вызове POST /{integration}/setup:

bash
# Локально (worker должен быть запущен)
curl -X POST http://localhost:8787/{integration}/setup

# На dev/prod (после деплоя)
curl -X POST https://integ.dev.happ.tools/{integration}/setup

# Проверить статус миграций
pnpm migrate:status

UNIQUE constraint failed

Сообщение:

D1_ERROR: UNIQUE constraint failed: table.column

Причина: Попытка вставить дубликат уникального значения.

Решение:

typescript
// Используй upsert вместо insert
await db.upsert("table", data, ["id"]);

// Или проверяй существование
const existing = await db.selectOne("table", { id });
if (!existing) {
  await db.insert("table", data);
}

Credentials decryption failed

Сообщение:

Error: Failed to decrypt credentials

Причина: Неверный CRYPTO_KEY или CRYPTO_SALT.

Решение:

  1. Проверь что CRYPTO_KEY и CRYPTO_SALT одинаковы во всех окружениях
  2. Если ключи менялись — нужно пересоздать credentials:
bash
# Вызови /setup для пересоздания
curl -X POST https://integ.happ.tools/{integration}/setup \
  -H "Content-Type: application/json" \
  -d '{"force": true}'

Development (Local)

Port already in use

Сообщение:

Error: listen EADDRINUSE: address already in use :::8787

Причина: Порт занят другим процессом.

Решение:

bash
# Найди процесс
lsof -i :8787

# Убей его
kill -9 <PID>

# Или используй другой порт
pnpm start sofa -- --port 8788

Miniflare storage error

Сообщение:

Error: ENOENT: no such file or directory, open '.../miniflare/...'

Причина: Локальное хранилище повреждено.

Решение:

bash
# Пересоздай локальные базы
pnpm setup:reset

Failed to connect to turbo daemon

Сообщение:

x Failed to connect to daemon.
`-> unable to connect to daemon after 3 retries

Причина: Turbo daemon завис или его socket повреждён.

Решение:

bash
# Очисти кэш turbo и убей процессы
rm -rf node_modules/.cache/turbo ~/.turbo
pkill -f "turbo.*daemon"

# Запусти заново
pnpm start sofa

Doppler not configured

Сообщение:

Error: Doppler project not configured

Причина: Doppler CLI не настроен для проекта.

Решение:

bash
doppler login
doppler setup
# Выбери project: integ-core
# Выбери config: dev (или local)

CI/CD

Turbo cache miss causing slow builds

Симптом: CI занимает >5 минут вместо <1 минуты.

Причина: Изменения в зависимостях инвалидируют кэш.

Решение: Это нормально после изменений в package.json или shared пакетах. Следующие билды будут быстрее.


Pre-commit hook failed

Сообщение:

husky - pre-commit script failed (code 1)

Причина: Код не прошёл lint или typecheck.

Решение:

bash
# Посмотри детали ошибки выше в логе
# Обычно это:

# 1. ESLint ошибки
pnpm lint:fix

# 2. TypeScript ошибки
pnpm typecheck

# 3. Prettier
pnpm format

PR merge conflict

Симптом: GitHub показывает конфликт при merge.

Решение:

bash
# Обнови ветку
git fetch origin dev
git merge origin/dev

# Разреши конфликты
git add .
git commit -m "Merge dev"
git push

Quick Reference

ОшибкаБыстрое решение
Cannot find modulepnpm install && pnpm build
no such tablePOST /{integration}/setup
reading 'duration' (D1)Заменить d1.exec() на d1.prepare().run()
Secret not foundpnpm sync-secrets:dev
Too many redirectsCloudflare SSL: Flexible → Full
Port in usekill -9 $(lsof -t -i:8787)
Pre-commit failedpnpm lint:fix && pnpm format
Failed to connect to daemonrm -rf ~/.turbo && pkill -f turbo

Связанные документы

  • TROUBLESHOOTING — расширенный troubleshooting
  • DEVELOPMENT — настройка локальной разработки
  • SECRETS — управление секретами
  • CI_CD — настройка CI/CD