← 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 {}