4.3 KiB
4.3 KiB
🚨 Быстрое исправление циклических зависимостей
Увидел ошибку? Действуй!
Error: A circular dependency has been detected inside DocumentDomainModule
Шаг 1: Запусти анализ (30 секунд)
pnpm analyze:modules
Откроются 2 файла:
potential-circular-dependencies.md- НАЧНИ С ЭТОГО!module-dependency-graph.md- полный граф
Шаг 2: Найди проблему в отчёте
Открой potential-circular-dependencies.md и ищи:
A) Секция "CRITICAL: Global modules importing non-global"
### ❌ BlockchainModule (@Global)
**Problematic imports:**
- ❌ RegistrationDomainModule (not global) 👈 ВОТ ОНО!
Решение:
// Вариант 1: Убери импорт
@Global()
@Module({
imports: [], // Убрал RegistrationDomainModule
})
export class BlockchainModule {}
// Вариант 2: Сделай импортируемый модуль тоже глобальным
@Global() // Добавил
@Module({...})
export class RegistrationDomainModule {}
B) Секция "Highly Coupled Modules"
### DocumentDomainModule 📦
⚠️ WARNING: Non-global module used by global module(s)! 👈 ПРОБЛЕМА!
Решение:
// В глобальном модуле используй forwardRef
@Global()
@Module({
imports: [forwardRef(() => DocumentDomainModule)],
})
Шаг 3: Если анализ не помог - метод комментирования
В app.module.ts:
@Module({
imports: [
// Инфраструктура
DatabaseModule,
RedisModule,
// Domain - КОММЕНТИРУЙ ПО ОДНОМУ!
// AuthDomainModule,
// AccountDomainModule,
RegistrationDomainModule, // 👈 Раскомментируй это
// DocumentDomainModule, // 👈 Потом это
// ParticipantDomainModule, // 👈 Потом это
],
})
Алгоритм:
- Закомментируй ВСЕ domain-модули
- Раскомментируй по одному
- После каждого раскомментирования запускай:
pnpm dev - Когда ошибка появится → ты нашёл виновника!
Шаг 4: Применяй стандартные решения
Решение 1: forwardRef в imports
@Module({
imports: [
forwardRef(() => AccountDomainModule),
forwardRef(() => DocumentDomainModule),
],
})
export class ParticipantDomainModule {}
Решение 2: forwardRef в инжекции
@Injectable()
export class MyService {
constructor(
@Inject(forwardRef(() => SOME_SERVICE))
private readonly someService: SomeService
) {}
}
Решение 3: Убрать лишний модуль
// ❌ БЫЛО два модуля
// document/document.module.ts
// document/document-validation.module.ts
// ✅ СТАЛО один модуль
@Module({
providers: [
DocumentService,
DocumentValidationService, // Просто добавили сюда
],
})
export class DocumentDomainModule {}
🎯 Чеклист: Что НЕ делать
- ❌ Не меняй порядок импортов (не поможет!)
- ❌ Не делай модуль глобальным без необходимости
- ❌ Не создавай отдельный модуль для одного сервиса
- ❌ Не импортируй не-глобальные модули в глобальные (без forwardRef)
🎯 Чеклист: Что делать
- ✅ Используй
pnpm analyze:modulesПЕРВЫМ делом - ✅ Используй forwardRef для domain-модулей
- ✅ Проверь, не является ли проблемный модуль глобальным
- ✅ Используй метод комментирования для точной локализации
📚 Подробности
См. полное руководство: CIRCULAR_DEPENDENCIES_GUIDE.md
Сохрани этот файл в закладки - он спасёт тебя часы отладки!