Mutations

Mutations

GraphQL에서 서버 측 데이터를 수정하기 위해 Mutaion을 사용합니다 (더 자세한 내용은 여기). 공식적인 Apollo 문서는 upvotePost() Mutation 예제를 공유합니다. 이 Mutation은 포스트 votes속성 값을 증가시킵니다. Nest에서 동등한 돌연변이를 만들기 위해 우리는@Mutation()데코레이터를 사용할 것입니다.

Schema first

이전 섹션에서 사용한 AuthorResolver를 확장 해 보자 (resolvers 참조).

@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

마지막 단계는 기존 유형 정의에 뮤테이션을 추가하는 것입니다.

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 참조).

@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 섹션에서와 같은 이유로 예상되는 유형을 명시적으로 설정해야 합니다.

뮤테이션이 개체를 매개 변수로 가져와야 하는 경우 입력 유형을 만들 수 있습니다.

@InputType()
export class UpvotePostInput {
  @Field() postId: number;
}

info 힌트 @InputType()@Field()는 모두 type-graphql 패키지에서 가져옵니다.

그런 다음 리졸버 클래스에서 사용하십시오.

@Mutation(returns => Post)
async upvotePost(
  @Args('upvotePostData') upvotePostData: UpvotePostInput,
) {}

Last updated