NestJS에서 Prisma 릴리즈에 대한 질의 내보내기

20181 단어 PrismaNestJStech
네스트JS가 프라임(Prism)을 처리할 때 발행된 조회가 어떤 것인지를 추적하려 했으나 어떤 공식 문서도 명확하게 기재되지 않아 메모였다.
https://docs.nestjs.com/recipes/prisma
https://www.prisma.io/docs/concepts/components/prisma-client/working-with-prismaclient/logging
또한 집필 환경의 의존 모듈 버전은 다음과 같다.버전 차이로 인한 문제 양해 부탁드립니다.
package.json
"dependencies": {
  "@nestjs/common": "^8.0.0",
  "@nestjs/core": "^8.0.0",
  "@prisma/client": "^3.11.1",
  "prisma": "^3.11.1"
}

Prisma on NestJS의 초기 모델


NestJS에서 Prisma를 사용할 때 실례화하지 않고 서비스로 정의하여 각각의 모듈에서 사용합니다.DB 연결을 시도하는 라이프 사이클 이벤트onModuleInit의 정의는 현재 선택적이며 이후의 해설을 위해 정의됩니다.
apps/api/src/prisma.service.ts
import {
  Injectable,
  OnModuleInit,
} from '@nestjs/common';
import { PrismaClient, Prisma } from '@prisma/client';

@Injectable()
export class PrismaService
  extends PrismaClient
  implements OnModuleInit
{
  async onModuleInit() {
    await this.$connect();
  }
}

로그 설정


이 모형에 대해서는 다음과 같이 추가로 설치하면 된다.

  • Logger 인스턴스@nestjs/common 확보
  • 구조기super로g 출력 지정
  • 이곳의 매개 변수는 PreismaClient 인스턴스화와 같다
  • onModuleInit에 이벤트 청취자 등록
  • 실행 시간의 상기 3가지 수정만으로도 충분합니다. 그러면 this.$on 유형 오류가 발생할 수 있습니다.이 오류는 extends PrismaClientextends PrismaClient<Prisma.PrismaClientOptions, Prisma.LogLevel>로 수정하여 확장this.$on의 유형 추론을 할 수 있습니다.
    apps/api/src/prisma.service.ts
    import {
      Injectable,
      OnModuleInit,
    + Logger,
    } from '@nestjs/common';
    import { PrismaClient, Prisma } from '@prisma/client';
    
    @Injectable()
    export class PrismaService
    - extends PrismaClient
    + extends PrismaClient<Prisma.PrismaClientOptions, Prisma.LogLevel> // <- here
      implements OnModuleInit
    {
    + private readonly logger = new Logger(PrismaService.name);
    + constructor() {
    +   super({ log: ['query', 'info', 'warn', 'error'] });
    + }
      async onModuleInit() {
    +   this.$on('query', (event) => {
    +     this.logger.log(
    +       `Query: ${event.query}`,
    +       `Params: ${event.params}`,
    +       `Duration: ${event.duration} ms`,
    +     );
    +   });
    +   this.$on('info', (event) => {
    +     this.logger.log(`message: ${event.message}`);
    +   });
    +   this.$on('error', (event) => {
    +     this.logger.log(`error: ${event.message}`);
    +   });
    +   this.$on('warn', (event) => {
    +     this.logger.log(`warn: ${event.message}`);
    +   });
        await this.$connect();
      }
    }
    
    이렇게 발행된 조회가 출력되었습니다. (예는 PostgreSQL)
    prisma:query SELECT "public"."Post"."id", "public"."Post"."title", "public"."Post"."content", "public"."Post"."published", "public"."Post"."authorId" FROM "public"."Post" WHERE "public"."Post"."authorId" IN ($1) OFFSET $2
    [Nest] 46661  - 04/01/2022, 1:02:35 PM     LOG [PrismaService] Query: SELECT "public"."Post"."id", "public"."Post"."title", "public"."Post"."content", "public"."Post"."published", "public"."Post"."authorId" FROM "public"."Post" WHERE "public"."Post"."authorId" IN ($1) OFFSET $2
    [Nest] 46661  - 04/01/2022, 1:02:35 PM     LOG [PrismaService] Params: [3,0]
    [Nest] 46661  - 04/01/2022, 1:02:35 PM     LOG [PrismaService] Duration: 3 ms
    

    참고 자료


    https://stackoverflow.com/questions/67509194/logging-with-prisma-2-and-nestjs-dependency-injection-problem

    좋은 웹페이지 즐겨찾기