Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·60 871вакансия открыта сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 951
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python9 224
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 322
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • Backend вакансии1 317
  • iOS1 239
  • AI вакансии608
  • Fullstack вакансии523
  • Frontend вакансии456
  • Mobile вакансии28

По стеку

  • Go5 445
  • Java3 175
  • Kotlin1 119
  • Node.js1 026
  • Rust949
  • .NET666
  • PHP311
  • C#210
  • C++204

DevOps и инфраструктура

  • DevOps вакансии2 713
  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Wise191 вакансия
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis48 вакансий
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме NestJSВсе вопросы
NestJSMiddleТеория

В чём разница между forRoot() и forFeature() при регистрации модулей?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

forRoot() конфигурирует глобальный singleton-ресурс (соединение с БД) один раз в AppModule; forFeature() регистрирует конкретные сущности/схемы внутри фича-модуля и предоставляет их репозитории только в нём.

forRoot — глобальная конфигурация

forRoot() регистрирует соединение (или другой тяжёлый singleton) один раз в корневом модуле и помечает его global: true, чтобы сделать провайдеры доступными во всём приложении без повторного импорта.

// app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'postgres',
      password: 'secret',
      database: 'app',
      autoLoadEntities: true,
      synchronize: false,
    }),
  ],
})
export class AppModule {}

forRoot() и forFeature() в NestJS

Это конвенция для динамических модулей, которая позволяет один раз сконфигурировать глобальный ресурс (forRoot) и многократно подключить его части в отдельных фича-модулях (forFeature). Классические примеры — TypeOrmModule, MongooseModule, SequelizeModule.

forFeature — регистрация сущностей в конкретном модуле

forFeature() принимает список сущностей (или схем) и предоставляет репозитории только внутри текущего модуля через InjectRepository:

// users.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';

@Module({
  imports: [TypeOrmModule.forFeature([User])],
  providers: [UsersService],
  controllers: [UsersController],
  exports: [UsersService],
})
export class UsersModule {}
// users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly userRepo: Repository<User>,
  ) {}

  findAll(): Promise<User[]> {
    return this.userRepo.find();
  }
}

Собственный динамический модуль с forRoot/forFeature

Можно реализовать тот же паттерн самостоятельно:

// cache.module.ts
import { DynamicModule, Global, Module } from '@nestjs/common';

export interface CacheModuleOptions {
  ttl: number;
  host: string;
}

@Global()
@Module({})
export class CacheModule {
  static forRoot(options: CacheModuleOptions): DynamicModule {
    return {
      module: CacheModule,
      providers: [
        { provide: 'CACHE_OPTIONS', useValue: options },
        CacheService,
      ],
      exports: [CacheService],
    };
  }

  static forFeature(namespace: string): DynamicModule {
    return {
      module: CacheModule,
      providers: [
        {
          provide: `CACHE_NAMESPACE_${namespace.toUpperCase()}`,
          useFactory: (svc: CacheService) => svc.createNamespace(namespace),
          inject: [CacheService],
        },
      ],
      exports: [`CACHE_NAMESPACE_${namespace.toUpperCase()}`],
    };
  }
}

forRootAsync — асинхронная конфигурация

Когда настройки нужно получить из ConfigService, используется forRootAsync:

TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: (config: ConfigService) => ({
    type: 'postgres',
    url: config.get<string>('DATABASE_URL'),
    autoLoadEntities: true,
    synchronize: false,
  }),
})

Подводные камни

  • Вызывать forRoot() дважды с разными конфигурациями нельзя — второй вызов молча перезапишет первый. Для нескольких соединений используй именованные коннекции через name опцию.
  • Если модуль помечен @Global() и зарегистрирован через forRoot(), дополнительный импорт в других модулях не нужен. Повторный импорт не ломает, но создаёт путаницу.
  • forFeature() создаёт отдельный токен репозитория — InjectRepository(Entity) работает только в том модуле, который вызвал forFeature([Entity]). Использование репозитория в другом модуле без импорта даст ошибку DI.
  • Не забывай экспортировать TypeOrmModule из фича-модуля, если дочерний модуль тоже должен инжектировать тот же репозиторий.
  • При использовании synchronize: true в forRoot в продакшене — риск потери данных. Всегда выключай в production.
  • Асинхронная конфигурация через useFactory в forRootAsync выполняется при старте приложения. Если фабрика бросает исключение, приложение не запустится без внятной ошибки.
  • autoLoadEntities: true подгружает только сущности, зарегистрированные через forFeature. Сущности, не включённые ни в один модуль, не будут замечены TypeORM.

Типичные ошибки

  • Дает общий ответ про Node.js и не называет конкретные API NestJS.
  • Не объясняет, где в lifecycle находится forRoot() и forFeature().
  • Не разделяет validation, authorization, business logic и persistence.
  • Игнорирует ошибки, лимиты входных данных, observability и тестирование.

Что проверяет интервьюер

  • Может объяснить forRoot() и forFeature() на примере кода.
  • Называет ключевые API: forRoot(), forFeature().
  • Использует точные API NestJS, а не вымышленные hooks/decorators/methods.
  • Видит production-риски: безопасность, отказоустойчивость, логирование и тесты.

Как вы знаете этот вопрос?

Проверить себя по теме NestJS →

Источники

  • https://docs.nestjs.com/fundamentals/dynamic-modules
←Предыдущий вопросЧто такое Pipes в NestJS? Как использовать `ValidationPipe` и `ParseIntPipe`?Следующий вопрос→Что такое DTO (Data Transfer Objects) и как использовать `class-validator` с ними?

Связанные темы

NestJSapi-designmodule-organization

Частые вопросы на собеседовании

  • Что такое NestJS и каковы его основные принципы проектирования?
  • Какова роль модулей в NestJS? Как работает система модулей?
  • В каких backend-проектах NestJS является сильным выбором, а где лучше выбрать более простой или другой стек?
  • Что такое dependency injection (DI) в NestJS и как он реализован?