NestJSとGraphQLで開発用の環境を作成する

# NestJS と GraphQL で開発用の環境を作成する

#### 目次

1. NestJS のアプリケーションを作成
2. GraphQL の依存関係を構築する
3. mysql（docker）を用意する
4. mysql の依存関係を構築する

## 1. NestJS のアプリケーションを作成

[NestCli](https://docs.nestjs.com/cli/usages)を用いて NestJS のアプリケーションを構築する。

cli を install していない時は、上の URL から cli を install してアプリケーションを作成します。

```termianl
$ nest new nestjs-graphql
$ npm run start:dev
```

[localhost:3000](http://localhost:3000)で下記画面が表示されることを確認します。

![localhost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/f428c823-ce2c-4315-df10-665f0bc00940.png)


## 2. GraphQL の依存関係を構築する

[Qiita 記事](https://qiita.com/Gma_Gama/items/90b98e046e1b66a71c22)で記載しましたが、依存関係を解決していきます。

GraphQL を利用するのに必要な 4 つをインストールしていきます。

```terminal
$ npm i --save @nestjs/graphql graphql-tools graphql apollo-server-express
```

library の型定義で error がはかれないように、tsconfig.json を編集します。

```tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es2017",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    //ここから追記
    "skipLibCheck": true
　　//ここまで追記
  },
  "exclude": ["node_modules", "dist"]
}

```

[公式ドキュメント](https://docs.nestjs.com/graphql/quick-start)をもとに GraphQL の依存関係を app.module に定義していきます。

```src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { join } from 'path';

@Module({
  imports: [
    GraphQLModule.forRoot({
      debug: false,
      playground: true,
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/graphql.ts'),
        outputAs: 'class',
      },
    }),
  ],
})
export class AppModule {}
```

サーバーを起動し、[play ground](http://localhost:3000/graphql)にアクセスして paly groud が表示されることを確認します。

```terminal
$ npm run start:dev
```

下記のように Play Ground が表示されます。

![playgorund.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144543/13b1f329-c198-59da-31b4-e05623dd1666.png)


## 3. mysql（docker）を用意する

*docker-compose.yml*と*Dockerfile*を追加していきます。

```termianl
$ touch docker-compose.yml
$ touch Dockerfile
```

現状のディレクトリ構成は、以下になる想定です。

```terminal
$ tree -L 1 -I node_modules
.
├── Dockerfile
├── README.md
├── dist
├── docker-compose.yml
├── nest-cli.json
├── package-lock.json
├── package.json
├── src
├── test
├── tsconfig.build.json
└── tsconfig.json

```

MySQL のみの docker を作成するので、起動に必要な設定を作成していきます。

```Dockerfile
FROM mysql:5.7
```

```docker-compose.yml
version: '3.7'
services:
  db:
    build: .
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    tty: true
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: develop

```

最後に docker を起動して正常に動作するか確認します。

```terminal
$ docker-compose up
$ docker ps -a
```

## 4. mysql の依存関係を構築する

[公式ドキュメント](https://docs.nestjs.com/techniques/database)を目安に依存関係を構築していきます。

```terminal
$ npm install --save @nestjs/typeorm typeorm mysql
```

上記のインストールが完了したら、app.module に必要な設定を記載していきます。お行儀が悪いですが、とりあえず動くように設定を記載していきます。

```src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { TypeOrmModule } from '@nestjs/typeorm';
import { join } from 'path';

@Module({
  imports: [
    GraphQLModule.forRoot({
      typePaths: ['./**/*.graphql'],
      definitions: {
        path: join(process.cwd(), 'src/models/graphql.ts'),
        outputAs: 'class',
      },
    }),
    TypeOrmModule.forRootAsync({
      useFactory: () => ({
        type: 'mysql',
        host: 'localhost',
        port: 3306,
        username: 'root',
        password: 'example',
        database: 'develop',
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        synchronize: true,
      }),
    }),
  ],
})
export class AppModule {}

```

上記で簡易的な設定が完了したと思うので、あとは適宜 GraphQL を記載していけば実装できます。

[レポ](https://github.com/Ntakuya/nestjs-graphql/tree/env/sql)