TypeORM MySQL/PostgreSQL을 사용하여 NestJS에서 사용자 지정 데이터베이스 모듈 만들기

소개



먼저 다음 기사를 확인하십시오.
Sequelize에 대한 사용자 지정 데이터베이스 설정: https://www.freecodecamp.org/news/build-web-apis-with-nestjs-beginners-guide/
MongoDB에 대한 사용자 지정 데이터베이스 설정:
특히 Victor의 첫 번째 기사에서 많은 영감을 얻었습니다.

설치 프로젝트



우리는 다음과 같이 새 둥지 프로젝트를 만듭니다.

$ nest new custom-db-project


우리는 또한 필요한 모든 것을 설치할 것입니다.

$ npm install --save @nestjs/typeorm @nestjs/config typeorm mysql2 dotenv



이제 사용자 지정 데이터베이스 모듈을 다음과 같이 생성합니다.

$ nest generate module core/database


...
코딩하자

데이터베이스 인터페이스



데이터베이스 폴더 안에 인터페이스 폴더를 생성하고 그 안에 dbConfig.interface.ts 파일을 생성합니다. 이것은 데이터베이스 구성 인터페이스를 위한 것입니다.

각 데이터베이스 환경에는 선택적으로 다음 속성이 있어야 합니다.

export interface IDatabaseConfigAttributes {
    username?: string;
    password?: string;
    database?: string;
    host?: string;
    port?: number;
    type?: string;
    urlDatabase?: string;
    entities?: string[];
    migrationsTableName?: string;
    migrations?: string[];
    cli?: {
        migrationsDir?: string;
    }
    synchronize?: boolean;
}

export interface IDatabaseConfig {
    development: IDatabaseConfigAttributes;
    test: IDatabaseConfigAttributes;
    production: IDatabaseConfigAttributes;
}


데이터베이스 구성



이제 데이터베이스 환경 구성을 생성해 보겠습니다. 데이터베이스 폴더 안에 database.config.ts 파일을 생성합니다.

import * as dotenv from 'dotenv';
import { IDatabaseConfig } from './interfaces/dbConfig.interface';

dotenv.config();

let entities = [__dirname + '/**/*.entity{.ts,.js}']

let migrationsDir = 'src/migration';
let migrations = [migrationsDir + '/*.ts']

export const databaseConfig: IDatabaseConfig = {
    development: {
        username: process.env.DB_USER,
        password: process.env.DB_PASS,
        database: process.env.DB_NAME_DEVELOPMENT,
        host: process.env.DB_HOST,
        port: +process.env.DB_PORT,
        type: process.env.DB_DIALECT,
        entities: entities,
        migrationsTableName: process.env.DB_MIGRATION_TABLE_NAME,
        migrations: migrations,
        cli: {
            migrationsDir: migrationsDir
        },
        synchronize: true
    },
    test: {
        username: process.env.DB_USER,
        password: process.env.DB_PASS,
        database: process.env.DB_NAME_TEST,
        host: process.env.DB_HOST,
        port: +process.env.DB_PORT,
        type: process.env.DB_DIALECT,
        entities: entities,
        migrationsTableName: process.env.DB_MIGRATION_TABLE_NAME,
        migrations: migrations,
        cli: {
            migrationsDir: migrationsDir
        },
        synchronize: true
    },
    production: {
        username: process.env.DB_USER,
        password: process.env.DB_PASS,
        database: process.env.DB_NAME_PRODUCTION,
        host: process.env.DB_HOST,
        port: +process.env.DB_PORT,
        type: process.env.DB_DIALECT,
        entities: entities,
        migrationsTableName: process.env.DB_MIGRATION_TABLE_NAME,
        migrations: migrations,
        cli: {
            migrationsDir: migrationsDir
        },
        synchronize: true
    },
};


환경에 따라 사용해야 하는 구성이 결정됩니다.

.env 파일



프로젝트 루트 폴더에서 .env 파일을 만듭니다.

DB_HOST=localhost
DB_PORT=3306
DB_USER=database_user_name
DB_PASS=database_password
DB_DIALECT=postgres
DB_NAME_TEST=test_database_name
DB_NAME_DEVELOPMENT=development_database_name
DB_NAME_PRODUCTION=production_database_name
DB_MIGRATION_TABLE_NAME=migration



.gitignore 파일에 .env를 추가하는 것을 잊지 마십시오.

@nestjs/config 가져오기



@nestjs/config를 앱 루트 모듈로 가져옵니다.

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { DatabaseModule } from './core/database/database.module';

@Module({
  imports: [
    ConfigModule.forRoot({ isGlobal: true }),
    DatabaseModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}


Victor는 ConfigModule.forRoot({ isGlobal: true })를 isGlobal: true로 설정하면 애플리케이션 전체에서 .env 속성을 사용할 수 있다고 지적했습니다.

데이터베이스 공급자



데이터베이스 공급자를 만들어 보겠습니다. 데이터베이스 폴더 안에 database.providers.ts라는 파일을 만듭니다.

핵심 디렉토리에는 모든 핵심 설정, 구성, 공유 모듈, 파이프, 가드 및 미들웨어가 포함됩니다.

database.providers.ts에 다음을 추가해 보겠습니다.

import { TypeOrmModule } from '@nestjs/typeorm';
import { TYPEORM ,DEVELOPMENT, TEST, PRODUCTION } from '../constants';
import { databaseConfig } from './database.config';

export const databaseProviders = [{
    provide: TYPEORM,
    useFactory: async () => {
      let config;
      switch (process.env.NODE_ENV) {
      case DEVELOPMENT:
         config = databaseConfig.development;
         break;
      case TEST:
         config = databaseConfig.test;
         break;
      case PRODUCTION:
         config = databaseConfig.production;
         break;
      default:
         config = databaseConfig.development;
      }

      const typeOrm = TypeOrmModule.forRoot(config);

      return typeOrm
    },
}];



여기에서 애플리케이션은 현재 실행 중인 환경을 결정한 다음 환경 구성을 선택합니다.

모범 사례: 모든 문자열 값을 상수 파일에 보관하고 해당 값의 철자가 틀리지 않도록 내보내는 것이 좋습니다. 또한 한 곳에서 변경할 수 있습니다.

core 폴더 안에 constants 폴더를 생성하고 그 안에 index.ts 파일을 생성합니다. 다음 코드를 붙여넣습니다.

export const TYPEORM = 'TYPEORM';
export const DEVELOPMENT = 'development';
export const TEST = 'test';
export const PRODUCTION = 'production';


이 글이 누군가에게 도움이 되기를 바랍니다. Nestjs를 시작하려면 Victor의 기사를 확인하세요.

좋은 웹페이지 즐겨찾기