info 힌트@Resolver()데코레이터를 사용하는 경우 클래스를 @Injectable()으로 표시할 필요가 없습니다. 그렇지 않으면 필요합니다.
@Resolver()데코레이터는 쿼리와 돌연변이 (@Query()와 @Mutation()데코레이터 모두)에 영향을 미치지 않습니다. 이 특정 클래스 내부의 각 @ResolveProperty()에는 부모 (이 경우에는 Author 유형) (Author.posts관계)가 있음을 Nest에게만 알려줍니다. 기본적으로 클래스 상단에@Resolver()를 설정하는 대신 메소드에 가깝게 수행할 수 있습니다.
@Resolver('Author')
@ResolveProperty()
async posts(@Parent() author) {
const { id } = author;
return await this.postsService.findAll({ authorId: id });
}
그러나 하나의 클래스 안에 여러 개의 @ResolveProperty()가 있다면, 반드시 @Resolver()를 추가해야 합니다.
일반적으로 우리는 메소드 이름으로 getAuthor() 또는 getPosts()와 같은 것을 사용합니다. 데코레이터의 괄호 사이에서 실제 이름을 이동하면 쉽게 할 수 있습니다.
이전 챕터에서 타이핑 생성 기능 (outputAs: 'class' 포함)을 활성화 했다고 가정하면 응용 프로그램을 실행하면 다음 파일이 생성됩니다.
export class Author {
id: number;
firstName?: string;
lastName?: string;
posts?: Post[];
}
export class Post {
id: number;
title: string;
votes?: number;
}
export abstract class IQuery {
abstract author(id: number): Author | Promise<Author>;
}
클래스를 사용하면 데코레이터를 사용하여 유효성 검사 목적에서 매우 유용합니다 (여기 참조). 예를 들면 다음과 같습니다.
import { MinLength, MaxLength } from 'class-validator';
export class CreatePostInput {
@MinLength(3)
@MaxLength(50)
title: string;
}
warning 알림 입력 및 파라미터의 자동 유효성 검사를 활성화하려면 ValidationPipe를 사용해야합니다. 유효성 검사 여기 또는 파이프 여기에 대해 자세히 알아보십시오.
그럼에도 불구하고 데코레이터를 자동으로 생성된 파일에 직접 추가하면 연속된 각 변경에 따라 제거됩니다. 따라서 별도의 파일을 작성하고 생성된 클래스를 간단히 확장해야합니다.
import { MinLength, MaxLength } from 'class-validator';
import { Post } from '../../graphql.ts';
export class CreatePostInput extends Post {
@MinLength(3)
@MaxLength(50)
title: string;
}
Code first
코드 우선 접근 방식에서는 SDL을 직접 작성할 필요가 없습니다. 대신 데코레이터 만 사용합니다.