🧏
NestJS, Prisma, PostgreSQL(Docker)で...Part2
ユーザー登録のAPIつくっていくよ
前回の続きです
前回はDBの接続までできたことだしCreateAPI
一個作ってみましょう!
とはいえNestわからんのやが😠
というバックエンド入門中の方のために若干説明しておきます
まずメインの3つ(service, controller, module)を簡単に
-
service
は主にDBの操作を担う部分です、ロジックを書いてDBのこのテーブルにレコードを追加する、とか探してくる、とかする部分です -
controller
はこのエンドポイント(URLのパス)にリクエストが来たらこのservice
を呼びます、といったルーティングの役割を果たします -
module
はservice, controller, その他...
をまとめて管理します。
公式
service: https://docs.nestjs.com/providers
controller: https://docs.nestjs.com/controllers
module: https://docs.nestjs.com/modules
開発の基本的な手順は
- schemaにDBの定義をする
-
$ npx prisma generate
して型の生成をする - module, service, controllerを生成する
- serviceにdb操作の内容を定義する
- controlleに作成したどんなリクエストが来たらどのserviceを実行するか定義する
- moduleでつなぐ(注入する)(コマンドで生成したら大体自動で注入してくれてる)
んじゃそろそろ本題に移りましょう!
事前準備(1)
-
service
内でPrisma
を使うためのPrismaService定義しておく - 生成
$ nest g module prisma
$ nest g service prisma
- 定義
# prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
async onModuleInit() {
await this.$connect();
}
}
事前準備(2)
- 生成
$ nest g module user &&
nest g service user &&
nest g controller user
-
request body
の型定義しておくよ
# user/dto/create-user.dto.ts
export class CreateUserDto {
username: string;
email: string;
password: string;
}
-
UserModule
に先ほど作成したPrismaModule
をimport
!(注入っていうらしい
# user.module.ts
@Module({
imports: [PrismaModule],
providers: [UserService],
controllers: [UserController],
})
Service作成
-
$ npm i bcrypt
(平文字をhash化してくれるやつ)
# user.service.ts
import { Injectable } from '@nestjs/common';
import { User } from '@prisma/client';
import * as bcrypt from 'bcrypt';
import { PrismaService } from '../prisma/prisma.service';
import { CreateUserDto } from './dto/create-user.dto';
@Injectable()
export class UserService {
constructor(private prisma: PrismaService) {}
async create(data: CreateUserDto): Promise<User> {
const hashedPassword = await bcrypt.hash(data.password, 10);
return this.prisma.user.create({
data: {
...data,
password: hashedPassword,
},
});
}
}
受け取ったdata
の内、password
をhash化してからdata
に入れ直してcreate
します
Controller作成
# user.controller.ts
import { Body, Controller, Post } from '@nestjs/common';
import { UserService } from './user.service';
import { CreateUserDto } from './dto/create-user.dto';
import { User } from '@prisma/client';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post('register')
async register(@Body() createUserDto: CreateUserDto): Promise<User> {
return this.userService.create(createUserDto);
}
}
POST user/register
てリクエストが来たらBody
の内容をそのままuserService.create
に渡して呼び出すてだけです
※ ここまででUser型ないよってエラーでてる方、
$ npx prisma generate
するとnode_modules/@prisma/client
に型が自動生成されます
動作確認
docker, Nest
の起動
$ docker-compose up -d
$ npm run start:dev
私はpostman
を使います、がcurlでもvsCodeの拡張機能でもなんでもいいです
(installしたい方はこちらから
それでは確認してみましょう、以下の通りにPOSTしてみてください
method: POST
URL: http://localhost:3000/user/register
Body: {
"username": "user1",
"email": "user1@example.com",
"password": "password"
}
えいっ!
..
問題なさそうですね。。。?
prisma studioからも、1件リクエスト通りに追加されてることを確認できました!🎉
乙!
Next ▶ 認証を必要とするエンドポイント(JWT)ってやつを作っていこうと思います
Discussion