처음 nest new

32578 단어 NestJStech

의 목적


나는 일에 있어서NestJS를 사용하지만, 나 자신은 그렇지 않다.해본 적이 없어 학습의 의미에서 간단한 크루 처리를 만들었고, 그래서 기록을 남기고 싶어 키보드를 들었다.

컨디션


OS:macOS Big Sur 11.1
Node:v14.4.0
NestJS:7.5.4

가져오기


npm i -g @nestjs/cli

신축 공사


nest new nestjs_todo

필요한 물건을 가져오다


npm i @nestjs/typeorm typeorm mysql2 class-transformer class-validator

ormconfig.json 만들기


ormconfig.json
{
  "name": "default",
  "type": "mysql",
  "host": "localhost",
  "port": 3306,
  "username": "root",
  "password": "",
  "database": "nest",
  "synchronize": true,
  "logging": true,
  "entities": [
    "dist/entities/**/*.entity.js"
  ],
  "migrations": [
    "dist/migrations/**/*.js"
  ]
}

엔티티 파일 만들기


src/entities/task.entity.ts
import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  CreateDateColumn,
  UpdateDateColumn,
} from "typeorm";

@Entity()
export class Task {
  @PrimaryGeneratedColumn()
  readonly id: number;

  @Column()
  title: string;

  @CreateDateColumn()
  readonly createdAt?: Date;

  @UpdateDateColumn()
  readonly updatedAt?: Date;
}

migration 파일 만들기


npx typeorm migration:generate -d src/migrations -n create-task
src/migrations/1608641968685-create-task.ts
import {MigrationInterface, QueryRunner} from "typeorm";

export class createTask1608641968685 implements MigrationInterface {
    name = 'createTask1608641968685'

    public async up(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query("CREATE TABLE `task` (`id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `createdAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `updatedAt` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), PRIMARY KEY (`id`)) ENGINE=InnoDB");
    }

    public async down(queryRunner: QueryRunner): Promise<void> {
        await queryRunner.query("DROP TABLE `task`");
    }

}

실행


npx typeorm migration:run

Controller 만들기


nest g controller tasks
src/tasks/tasks.controller.ts
import { Controller } from '@nestjs/common';

@Controller('tasks')
export class TasksController {}

서비스 작성


nest g service tasks
src/tasks/tasks.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class TasksService {}

모듈 생성


nest g module tasks
src/tasks/tasks.module.ts
import { Module } from '@nestjs/common';

@Module({})
export class TasksModule {}

읽기 처리 설치


src/tasks/tasks.controller.ts
import { Controller, Get } from '@nestjs/common';
import { Task } from 'src/entities/task.entity';
import { TasksService } from './tasks.service'

@Controller('tasks')
export class TasksController {
  constructor(private readonly taskService: TasksService) {}

  @Get()
  async findAll(): Promise<Task[]> {
    return await this.taskService.findAll()
  }
}
src/tasks/tasks.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Task } from 'src/entities/task.entity';
import { TasksController } from './tasks.controller';
import { TasksService } from './tasks.service';

@Module({
  controllers: [TasksController],
  imports: [TypeOrmModule.forFeature([Task])],
  providers: [TasksService],
  exports: [TypeOrmModule],
})
export class TasksModule {}
src/tasks/tasks.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Task } from 'src/entities/task.entity';
import { Repository } from 'typeorm';

@Injectable()
export class TasksService {
  constructor(
    @InjectRepository(Task)
    private readonly taskRepository: Repository<Task>
  ) {}

  async findAll(): Promise<Task[]> {
    return await this.taskRepository.find()
  }
}

Create 처리 수행


src/dto/create-task.dto.ts
import { IsNotEmpty, IsString } from "class-validator";

export class CreateTaskDTO {
  @IsNotEmpty()
  @IsString()
  title: string;
}
src/main.ts
import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  // 追加
  app.useGlobalPipes(new ValidationPipe());
  await app.listen(3000);
}
bootstrap();
src/tasks/tasks.controller.ts
@Post()
async create(@Body() createTaskDto: CreateTaskDTO) {
  return await this.taskService.create(createTaskDto)
}
src/tasks/tasks.service.ts
async create(task: CreateTaskDTO): Promise<InsertResult> {
  return await this.taskRepository.insert(task)
}

업데이트 처리


src/dto/update-task.dto.ts
import { IsNotEmpty, IsString } from "class-validator";

export class UpdateTaskDto {
  @IsNotEmpty()
  @IsString()
  title: string;
}
src/tasks/tasks.controller.ts
@Put(':id')
async update(@Param('id') id: string, @Body() updateTaskDto: UpdateTaskDto) {
  return await this.taskService.update(+id, updateTaskDto)
}
src/tasks/tasks.service.ts
async update(id: number, updateTaskDto: UpdateTaskDto) {
  return await this.taskRepository.update(id, updateTaskDto)
}

Delete 프로세스 설치


src/tasks/tasks.controller.ts
@Delete(':id')
async remove(@Param('id') id: string) {
  return this.taskService.remove(+id)
}
src/tasks/tasks.service.ts
async remove(id: number) {
  return await this.taskRepository.delete(id)
}

감상


제로에서부터 스스로 시도하는 것은 큰 부분이지만 새로운 지식을 늘릴 수 있다.그리고 공식 홈페이지의 문서의 이해성을 다시 한 번 느꼈다.
코드 전체는 아래 창고를 통해 확인할 수 있습니다.
https://github.com/youheiyouhei/nestjs_todo

참고 자료


https://docs.nestjs.com
https://github.com/typeorm/typeorm

좋은 웹페이지 즐겨찾기