🥠BLOCKTRIPプロジェクト-4|DBバインド


blocktrip 4回目のタックル


本当に久しぶりに開発ログを書きました
元なら週に1回コードテストの練習問題を解いて、
ログ記録など多様なコンテンツの開発過程を行うべきだったが、個人的な状況(番外、圧力)のため、ようやく段階的に回復し、再開しなければならない.
  • nestJsinitプロセス省略
  • データベース構成


    まず、自分の設計に基づいて、ユーザーの作成と管理から始めます.
    だからローカルのmysqlに接続したいので、今度はmysqlをドックに置いて管理します.
    もっと軽くて便利ではないでしょうか.それを思いついて、mysql容器をdockerに置きました.
    ドッキングステーションの設置中に作成しました.
    私の場合、windowsdackerデスクトップをダウンロードして使用しました.
    WSL 2が必要
    |mysql画像をダウンロードします.
    docker pull mysql
    |コンテナを作成して実行します.
    docker run --name mysql -e MYSQL_ROOT_PASSWORD=<password> -d -p 3306:3306 mysql:latest
    |MySQL Docker接続
    docker exec -it mysql-container bash
    接続する前に、bashに接続するにはdocker desktopでコンテナを実行する必要があります.

    次にパスワードを入力してログインすると、以下のようにShow DATABASESを使用してデータベースを表示できます.

    ここまで、docker mysql構成を簡単に簡略化しました.
    次に、実際の接続があるかどうかを見てみましょう.

    nestJSとmysqlの連動


    nestJS - Database
    公式ドキュメントを参照するとすぐに接続できますが、データベース情報を隠す必要があります.
    Databaseは単独で分離してnestJSのモードで働きたいと思っています.
    npm install --save @nestjs/typeorm typeorm mysql2
    まず,typeormを用いてクエリーを行うために,上記のパッケージをインストールした.
    npm install --save @nestjs/config joi
    次に、環境変数を設定するconfigと、環境変数をチェックするjoiパッケージを選択してインストールします.
    // app.module.ts
    
    import { Module } from '@nestjs/common';
    import { TypeOrmModule } from '@nestjs/typeorm';
    import { Connection } from 'typeorm';
    import { UserModule } from './user/user.module';
    import { DataBaseService } from './database/database.service';
    import { DatabaseModule } from './database/database.module';
    import { ConfigModule, ConfigService } from '@nestjs/config';
    import { AuthModule } from './auth/auth.module';
    import * as Joi from 'joi';
    
    @Module({
      imports: [
        ConfigModule.forRoot({
          isGlobal: true,
          validationSchema: Joi.object({
            DATABASE_PORT: Joi.number().required(),
            DATABASE_USER: Joi.string().required(),
            DATABASE_PASSWORD: Joi.string().required(),
            DATABASE_NAME: Joi.string().required(),
            JWT_SECRET_KEY: Joi.string().required(),
          }),
        }),
        TypeOrmModule.forRoot(
          new DataBaseService(new ConfigService()).getTypeOrmConfig(),
        ),
        UserModule,
        DatabaseModule,
        AuthModule,
      ],
      controllers: [],
      providers: [],
    })
    export class AppModule {
      constructor(private connection: Connection) { }
    }
    
    既存のnodejsで使用されているdotnvではなく、nestjsが提供するConfigModuleを使用します.
    envが設定されています.
        ConfigModule.forRoot({
          isGlobal: true,
          validationSchema: Joi.object({
            DATABASE_PORT: Joi.number().required(),
            DATABASE_USER: Joi.string().required(),
            DATABASE_PASSWORD: Joi.string().required(),
            DATABASE_NAME: Joi.string().required(),
            JWT_SECRET_KEY: Joi.string().required(),
          }),
    ConfigModule.forRootを使用すると、環境変数をどこでも呼び出すことができます.
    isGlobalオプションはtrueで、グローバルに使用できます.
    validationSchemaを使用して、先ほどインストールしたJoiを使用して環境変数を確認します.
    データベースに接続するには、TypeOrmModuleを使用する必要があります.
       TypeOrmModule.forRoot(
          new DataBaseService(new ConfigService()).getTypeOrmConfig(),
        )
    new DataBaseServiceは私が作成したDataBaseに接続するためのサービスです.コードはこうです.
    // database/database.service.ts
    import { Injectable } from '@nestjs/common';
    import { ConfigService } from '@nestjs/config';
    import { TypeOrmModuleOptions } from '@nestjs/typeorm';
    
    @Injectable()
    export class DataBaseService {
        constructor(private readonly config: ConfigService) { }
    
        public getTypeOrmConfig(): TypeOrmModuleOptions {
            return {
                type: 'mysql',
                host: 'localhost',
                port: +this.config.get('DATABASE_PORT'),
                username: this.config.get('DATABASE_USER'),
                password: this.config.get('DATABASE_PASSWORD'),
                database: this.config.get('DATABASE_NAME'),
                entities: ["dist/**/*.entity{.ts,.js}"],
                synchronize: true,
                autoLoadEntities: true,
            };
        }
    }
    私の場合、hostはlocalhostです.まだローカルで開発されているからです.
    prodは同期オプションを推奨しません.
    表は簡単に作成できますが、本書ではprodで
    私はあなたを放弃させます.
    AutoLoadEntitiesを使用してエンティティを自動的にロードします.
    私のエンティティはコンパイルされたdistフォルダにあるので、パスを上記に設定します.
    残りの情報は、環境変数構成サービスとして使用されます.get()メソッドでインポートできます.
    Env設定(通常はdev、prodに分けます).
    // .env
    DATABASE_PORT=3306
    DATABASE_USER=USER
    DATABASE_PASSWORD=PASSWORD
    DATABASE_NAME=NAME
    データベース・モジュールでは、プロバイダにサービスを追加することを忘れないでください.
    // database/database.module.ts
    import { Module } from '@nestjs/common';
    import { DataBaseService } from './database.service';
    
    @Module({
        providers: [DataBaseService],
    })
    export class DatabaseModule { }
    
    docker mysqlは開いていて、設定も終わりました.npm runstartを試してみてください.

    正常なロードが完了しました.
    最初は正常に動作しなかった場合、エラーが発生します.
    実際には、dbツールを使用してデータまたはテーブルを検証できます.
    ツールに接続情報を入力します.

    コネクタテストに成功しました.
    これで完成したらコネクタ成功!
    ここまで、私のサーバーでdocker mysqlと連動しました!
    幸いなことに、phpやexpressではなく、会社からバックエンドに移行しました.
    他のフレームワークで働くのは初めてです.
    NestJSはexpressとfastifyフレームワークを統合し、Java Springのモードに従います.
    必要なものが用意されていて、コードをすばやく簡潔に分けることができて、いい感じです.
    次に、ユーザーモジュールを作成し、ユーザーモジュールの作成とログインを試みます.
    コア機能の開発が完了したら、削除または変更を更新する準備をします.
    実は終わってから追加する資格はありません.远い道のり
    いずれにしても、デザイン通りに続けていきたいと思います.