9wandinavian
logo-prisma.png

【Prisma利用編】NestJSとPrisma

Prismaのセットアップが完了したら、Prismaを実際に利用するための細かい設定を加えていく。ここでは、Prismaの機能(要はDB操作)を実行するモジュールとしてPrismaModuleを作成し、他のfeatureモジュールでも利用できるように公開する。

Prismaモジュールの作成

nestcliで以下を実行する。

$ nest g mo prisma
$ nest g s prisma // テストファイルが不要であれば末尾に--no-specをつける

実行すると、次のようにディレクトリとファイルが作成される。

プロジェクト名
  ├── node_modules
  ├──── src
  │   │  └── prisma // 追加
  │   │        └── prisma.module.ts // 追加
  │   │        └── prisma.service.ts // 追加
  │   ├── app.controller.spec.ts
  │   ├── app.controller.ts
  │   ├── app.module.ts
  │   ├── app.service.ts
  │   └── main.ts
 略

prisma/prisma.service.tsの変更

環境変数のDATABASE_URLを取得してDBと接続する。下記でインポートされている継承元クラスであるPrismaClientは、createやdeleteなどのメソッドを持ったクラス。

// prisma/prisma.service.ts
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; // 環境変数を扱うためのService
import { PrismaClient } from '@prisma/client'; // PrismaServiceにはPrismaClientを継承させる

@Injectable()
export class PrismaService extends PrismaClient {
  // 環境変数からDBのURLを取得したいので、nestjが提供しているConfigServiceをDIする
  constructor(private readonly config: ConfigService) {
    super({
      datasources: {
        db: {
          url: config.get('DATABASE_URL'),
        },
      },
    });
  }
}

prisma/prisma.module.tsの変更

他のfeatureモジュールでも利用できるよう、exportsに追加して公開する。

import { Module } from '@nestjs/common';
import { PrismaService } from './prisma.service'; // 変更したPrismaServiceをインポートする

@Module({
  providers: [PrismaService],
  exports: [PrismaService], // PrismaServiceを利用したいモジュールで利用できるよう、エクスポートする
})
export class PrismaModule {}

PrismaModuleを利用したいfeatureモジュールでインポートする

Authモジュールで利用する例。auth/auth.module.tsで@Moduleデコレータ内のimportsプロパティでPrismaModuleを指定する。

import { Module } from '@nestjs/common';
import { AuthController } from './hoge.controller';
import { AuthService } from './hoge.service';
import { PrismaModule } from 'src/prisma/prisma.module'; // Prismaモジュールのインポート

@Module({
  imports: [PrismaModule], // Prismaモジュールのインポート
  controllers: [AuthController],
  providers: [AuthService],
})
export class AuthModule {}