Dev Study
NestJS コース

9. モジュール間の共有 — exports と imports

モジュール内の providers は、そのままでは同じモジュールの中からしか注入できません。他のモジュールにサービスを使わせたいときは、提供側が exports にそのプロバイダを載せ、利用側が imports でモジュールごと取り込みます。

実務では「注文処理がユーザー情報を参照する」のように機能間の連携が必ず発生します。exports に何を載せるかがそのモジュールの公開 API になるため、内部だけで使うサービスは exports に載せない、という線引きが設計の要点です。

つまずきポイントは、providers には登録したのに exports を忘れて、利用側で Nest can't resolve dependencies になるケースです。モジュールをまたぐ注入が解決できないときは、提供側の exports と利用側の imports の両方がつながっているか確認しましょう。

サンプルコード(フレームワーク環境が必要なため表示のみ)

import { Module, Injectable } from "@nestjs/common";
import { UsersService } from "./users.service";

@Module({
  providers: [UsersService],
  exports: [UsersService], // ここに載せて初めて外から使える
})
export class UsersModule {}

@Injectable()
export class OrdersService {
  // UsersModule が export しているので注入できる
  constructor(private readonly usersService: UsersService) {}
}

@Module({
  imports: [UsersModule], // モジュールごと取り込む
  providers: [OrdersService],
})
export class OrdersModule {}
公式ドキュメントで詳しく ↗