📝

Nestのコントローラーやマイグレーションなどを勉強

2024/02/27に公開

今回は NestJsとNextでAPI通信するためにControllerやmigrationのことをメモにしました。

Nestとは

Node.js上で動作するフレームワーク
Expressがコアとして作られおり、基本的にはTypeScript

Controllerの生成

そもそもコントローラーって.....?
アプリケーションから特定の要求を受信し、そのリクエストを制御する

npx nest g controller User

src/userにcontrollerファイルを作れます。
本来はコントローラーは作った後にapp.moduleに追記しないといけないのですが nest g で作った際には自動でおこなってくれています。おこなってくれています。

import { Controller, Get } from '@nestjs/common';

@Controller('user')
export class UserController {
  @Get('UserList')
  getUserList() {
    return [
      {
        id: 1,
        name: 'test',
        email: 'test@test.com',
        password: 'password',
      },
    ];
  }
}

試しにこの様に書いてみて

npm run start

そしたらこちら
で確認できます。

migration

マイグレーションをする前に Prismaをセットアップします

Prisma

npm i prisma

インストールが終わったら

npx prisma init

でセットアップします
そしたら
.envがファイルができていると思うので

# Environment variables declared in this file are automatically made available to Prisma.
# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema

# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB.
# See the documentation for all the connection string options: https://pris.ly/d/connection-strings

DATABASE_URL="postgresql://johndoe:randompassword@localhost:5432/mydb?schema=public"

こちらをご自身のpostgresや mysqlの設定のやつに書き換えます。

テーブル作成

.envファイルに記載が終わったらテーブルの作成をやっていきます。
先ほどの、プリズマのコマンドを実行時にPrisma/schema.prismaが出来ていると思うので、そちらに

model User{
  id Int @id @default(autoincrement())
  name String
  Email String @unique
  Password String
}

この様にUserテーブルを宣言してあげます。
https://www.prisma.io/docs/orm/reference/prisma-schema-reference
こちらを参考にしながら書きました。
書き終えたら、

npx prisma migrate dev --name user

と実行します。

DataBaseと連携

次にデータベースとの連携をしていこうと思います。

npm i @prisma/client

でprismaClientをインストールした後に

npx nest g service primsa
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

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

prisma.serviceにこの様にかき

import { Controller, Get } from '@nestjs/common';
import { PrismaService } from 'src/prisma/prisma.service';

@Controller('user')
export class UserController {
  constructor(private prisma: PrismaService) {}

  @Get('UserList')
  async getUserList() {
    const result = await this.prisma.user.findMany();
    return [...result];
  }
}

Controller側にSericeを宣言してあげて、getUserList中でuserテーブルに対してデータ取得を行いそれをreturn してあげることで、 データのカラムは帰ってきます。

Discussion