Mutations
GraphQL에서 서버 측 데이터를 수정하기 위해 Mutaion을 사용합니다 (더 자세한 내용은 여기 ). 공식적인 Apollo 문서는 upvotePost()
Mutation 예제를 공유합니다. 이 Mutation은 포스트 votes
속성 값을 증가시킵니다. Nest에서 동등한 돌연변이를 만들기 위해 우리는@Mutation()
데코레이터를 사용할 것입니다.
Schema first
이전 섹션에서 사용한 AuthorResolver
를 확장 해 보자 (resolvers 참조).
Copy @ Resolver ( 'Author' )
export class AuthorResolver {
constructor (
private readonly authorsService : AuthorsService ,
private readonly postsService : PostsService ,
) {}
@ Query ( 'author' )
async getAuthor (@ Args ( 'id' ) id : number ) {
return await this . authorsService .findOneById (id);
}
@ Mutation ()
async upvotePost (@ Args ( 'postId' ) postId : number ) {
return await this . postsService .upvoteById ({ id : postId });
}
@ ResolveProperty ( 'posts' )
async getPosts (@ Parent () { id }) {
return await this . postsService .findAll ({ authorId : id });
}
}
비즈니스 로직이 PostsService
(포스트 조회 및 투표) 속성으로 이동되었다고 가정했다.
Type definitions
마지막 단계는 기존 유형 정의에 뮤테이션을 추가하는 것입니다.
Copy type Author {
id : Int !
firstName : String
lastName : String
posts : [Post]
}
type Post {
id : Int !
title : String
votes : Int
}
type Query {
author(id : Int ! ) : Author
}
type Mutation {
upvotePost(postId : Int ! ) : Post
}
upvotePost(postId: Int!): Post
변이가 가능해야합니다.
Code first
이전 섹션에서 사용 된 AuthorResolver
에 다른 방법을 추가해 보자 (resolvers 참조).
Copy @ Resolver (of => Author)
export class AuthorResolver {
constructor (
private readonly authorsService : AuthorsService ,
private readonly postsService : PostsService ,
) {}
@ Query (returns => Author , { name : 'author' })
async getAuthor (@ Args ({ name : 'id' , type : () => Int }) id : number ) {
return await this . authorsService .findOneById (id);
}
@ Mutation (returns => Post)
async upvotePost (@ Args ({ name : 'postId' , type : () => Int }) postId : number ) {
return await this . postsService .upvoteById ({ id : postId });
}
@ ResolveProperty ( 'posts' )
async getPosts (@ Parent () author) {
const { id } = author;
return await this . postsService .findAll ({ authorId : id });
}
}
upvotePost()
는postId
(Int
)를 입력 매개 변수로 받아서 업데이트 된 Post
엔티티를 반환합니다. resolvers 섹션에서와 같은 이유로 예상되는 유형을 명시적으로 설정해야 합니다.
뮤테이션이 개체를 매개 변수로 가져와야 하는 경우 입력 유형을 만들 수 있습니다.
Copy @ InputType ()
export class UpvotePostInput {
@ Field () postId : number ;
}
info 힌트 @InputType()
과 @Field()
는 모두 type-graphql 패키지에서 가져옵니다.
그런 다음 리졸버 클래스에서 사용하십시오.
Copy @ Mutation (returns => Post)
async upvotePost (
@ Args ( 'upvotePostData' ) upvotePostData: UpvotePostInput ,
) {}