Модули
Модуль — класс с декоратором @Module(), который объединяет код одной части приложения: контроллеры, сервисы и настройки. В блоге будут модули статей, комментариев и пользователей, а корневой AppModule соберёт их вместе.
Модуль статей
Создайте модуль командой CLI:
nest g module postsПоявится файл src/posts/posts.module.ts:
// src/posts/posts.module.ts
import { Module } from '@nestjs/common';
@Module({})
export class PostsModule {}Пока модуль пустой. CLI уже подключил его к корневому модулю — в src/app.module.ts появилась строка imports: [PostsModule].
Четыре свойства модуля
| Свойство | Что в нём указывают |
|---|---|
controllers | Контроллеры, которые обрабатывают запросы этого модуля |
providers | Сервисы и другие классы, которые NestJS создаёт сам |
imports | Другие модули, чьими сервисами пользуется этот |
exports | Свои сервисы, которые можно отдать другим модулям |
После того как в модуле появятся контроллер и сервис, он выглядит так:
// src/posts/posts.module.ts
import { Module } from '@nestjs/common';
import { PostsController } from './posts.controller';
import { PostsService } from './posts.service';
@Module({
controllers: [PostsController],
providers: [PostsService],
})
export class PostsModule {}Сервис для другого модуля
Сервис по умолчанию виден только внутри своего модуля. Комментариям нужно проверять, что статья существует, поэтому модуль статей экспортирует свой сервис:
// src/posts/posts.module.ts
@Module({
controllers: [PostsController],
providers: [PostsService],
exports: [PostsService],
})
export class PostsModule {}А модуль комментариев импортирует модуль статей:
// src/comments/comments.module.ts
import { Module } from '@nestjs/common';
import { PostsModule } from '../posts/posts.module';
import { CommentsService } from './comments.service';
@Module({
imports: [PostsModule],
providers: [CommentsService],
})
export class CommentsModule {}Теперь CommentsService может получить PostsService — как именно, показано в уроке о сервисах.
Корневой модуль
// src/app.module.ts
import { Module } from '@nestjs/common';
import { PostsModule } from './posts/posts.module';
import { CommentsModule } from './comments/comments.module';
@Module({
imports: [PostsModule, CommentsModule],
})
export class AppModule {}При запуске NestJS начинает с AppModule и проходит по всем импортам. В терминале появятся строки вида PostsModule dependencies initialized — это значит, что модуль найден и собран.
Частая ошибка
Модуль экспортирует сервис, но другой модуль забыл его импортировать. NestJS при запуске напишет Nest can't resolve dependencies of the CommentsService (?) и укажет, в каком модуле искал. Нужны оба шага: exports в модуле-владельце и imports в модуле, который пользуется сервисом. Добавлять чужой сервис в свой providers нельзя — получится вторая независимая копия.