@mutation
@get
에는 화살표함수를 지원하지 않는다.
express에서는 바로 나가지만 (async await 필수)
nestjs에서는 기다리는 공간이 있어서 기다렸다가 나간다. (async await 자유)
class-validator 설치
$ yarn add class-validator
$ yarn add class-transformer
import { Field, InputType, Int } from '@nestjs/graphql';
import { Min } from 'class-validator';
@InputType()
export class CreateProductInput {
@Field(() => String)
name: string;
@Field(() => String)
description: string;
@Min(0) // 최소값 설정 => 0보다 작은 수는 못들어온다.
@Field(() => Int)
price: number;
}
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.useGlobalPipes(new ValidationPipe()); // ValidationPipe를 연결
await app.listen(3000);
}
bootstrap();
백엔드 개발자는 항상 수정과 삭제는 민감하게 반응해야한다.
▶ update-product.input.ts
@InputType()
export class UpdateProductInput extends PartialType(CreateProductInput) {
// 아래 내용들을 상속 받음
// @Field(() => String)
// name?: string;
//
// @Field(() => String)
// description?: string;
//
// @Field(() => Int)
// price?: number;
}
▶ products.service.ts에 추가
async update({ productId, updateProductInput }) {
const product = await this.productsRepository.findOne({
where: { id: productId },
});
// this.productsRepository.create() // 등록X, DB접속이랑 관련 없음 ( 객체를 따로 만들고 싶을 때 사용 )
// this.productsRepository.insert() // 등록 방법. (등록한 결과를 객체로 못 돌려받음)
// this.productsRepository.update({ 조건 }, { 수정할 내용 }) // 수정방법 (수정한 결과를 객체로 못 돌려받음)
// this.productsRepository.save({}) // 등록(id가 없으면)/수정(id가 있으면) 하고 조회해서 가져온다. (등록/수정한 결과를 객체로 돌려받음)
const result = this.productsRepository.save({
id: productId,
...product, // 수정 후, 수정되지 않ㅇ은 다른 결과값까지 모두 객체로 돌려 받고 싶을 때
...updateProductInput, // Key가 같아도 스프레드 연산자를 사용하면 아래있는 게 위에 것을 덮어씌운다.
// 아래 3줄이 위 1줄과 같다.(스프레드 연산자)
// name: updateProductInput.name,
// description: updateProductInput.description,
// price: updateProductInput.price,
});
return result;
}
}
async update({ productId, updateProductInput }) {
const product = await this.findOne(productId); // 위에 있는 API 활용
// this.productsRepository.create() // 등록X, DB접속이랑 관련 없음 ( 객체를 따로 만들고 싶을 때 사용 )
// this.productsRepository.insert() // 등록 방법. (등록한 결과를 객체로 못 돌려받음)
// this.productsRepository.update({ 조건 }, { 수정할 내용 }) // 수정방법 (수정한 결과를 객체로 못 돌려받음)
// this.productsRepository.save({}) // 등록(id가 없으면)/수정(id가 있으면) 하고 조회해서 가져온다. (등록/수정한 결과를 객체로 돌려받음)
const result = this.productsRepository.save({
id: productId,
...product, // 수정 후, 수정되지 않ㅇ은 다른 결과값까지 모두 객체로 돌려 받고 싶을 때
...updateProductInput, // Key가 같아도 스프레드 연산자를 사용하면 아래있는 게 위에 것을 덮어씌운다.
// 아래 3줄이 위 1줄과 같다.(스프레드 연산자)
// name: updateProductInput.name,
// description: updateProductInput.description,
// price: updateProductInput.price,
});
return result;
▶ products.resolver.ts에 추가
@Mutation()
updateProduct(
@Args('productId') productId: string,
@Args('updateProductInput') updateProductInput: UpdateProductInput,
) {
return this.productsService.update({ productId, updateProductInput });
}
에러 -> 코드를 잘못작성한 것
버그 -> 잘 작동되지만 의도되지 않은 것(제일 수정하기 힘듬)
예외 -> 예기치 못한 상황
상태코드 -> 정답은 없다, 프론트엔드 개발자에게 알려주기 쉽게 하기 위해서 사용한다.
NestJS 에서 제공해주는 ExceptionFilter
http-exception.filter.ts
import { Catch, ExceptionFilter, HttpException } from '@nestjs/common';
@Catch(HttpException)
class HttpExceptionFilter implements ExceptionFilter {
// 에러가 나면 여기로 날아온다.
catch(exception: HttpException) {
const status = exception.getStatus();
const message = exception.message;
console.log('===========================');
console.log('예외가 발생했어요!!');
console.log('예외내용:', message);
console.log('예외코드:', status);
console.log('===========================');
}
}
@Catch(HttpException)
=> 에러 관련된 내용이 들어가 있음을 NestJS 에게 알려주기 위한 데코레이터를 사용했습니다.catch
=> Exception 상황 발생시 비즈니스 로직에 try ~ catch 문이 없더라도 자동으로 에러가 catch 문으로 들어옵니다.exception
=> HttpException : HttpException type 으로 정의해줬습니다.implements ExceptionFilter
=> class 에서 타입을 정의 해주기 위해 implements 사용했습니다.출처 : 코드캠프