Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Модули

Модуль — класс с декоратором @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 нельзя — получится вторая независимая копия.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.