Mutatsiyalar
GraphQL haqida ko'p muhokamalar ma'lumot olishga qaratilgan, ammo to'liq ma'lumot platformasi server tomondagi ma'lumotlarni o'zgartirish usuliga ham muhtoj. RESTda har qanday so'r
GraphQL haqida ko'p muhokamalar ma'lumot olishga qaratilgan, ammo to'liq ma'lumot platformasi server tomondagi ma'lumotlarni o'zgartirish usuliga ham muhtoj. RESTda har qanday so'rov serverda side-effect keltirib chiqarishi mumkin, ammo eng yaxshi amaliyot GET so'rovlarida ma'lumotni o'zgartirmaslikni tavsiya qiladi. GraphQL ham shunga o'xshaydi - texnik jihatdan har qanday query ma'lumot yozish bilan implementatsiya qilinishi mumkin. Biroq, RESTdagi kabi, yozishlarni keltirib chiqaradigan operatsiyalarni aniq mutatsiya orqali yuborish tavsiya etiladi (batafsil bu yerda).
Rasmiy Apollo hujjatlarida upvotePost() mutatsiyasi misoli keltiriladi. Bu mutatsiya postning votes xossasini oshiradigan metodni implementatsiya qiladi. Nestda shunga o'xshash mutatsiya yaratish uchun @Mutation() dekoratoridan foydalanamiz.
Code first
Oldingi bo'limda ishlatilgan AuthorResolver ga yana bir metod qo'shamiz (qarang: resolvers).
1@Mutation(() => Post)
2async upvotePost(@Args({ name: 'postId', type: () => Int }) postId: number) {
3 return this.postsService.upvoteById({ id: postId });
4}Barcha dekoratorlar (@Resolver, @ResolveField, @Args va h.k.) @nestjs/graphql paketidan eksport qilinadi.
Bu GraphQL schema ning SDLda quyidagi qismini generatsiya qiladi:
1type Mutation {
2 upvotePost(postId: Int!): Post
3}upvotePost() metodi postId (Int) argumentini oladi va yangilangan Post entityni qaytaradi. resolvers bo'limida tushuntirilgan sabablarga ko'ra, kutilayotgan tipni aniq ko'rsatishimiz kerak.
Agar mutatsiya argument sifatida obyekt qabul qilishi kerak bo'lsa, input type yaratishimiz mumkin. Input type - bu argument sifatida uzatilishi mumkin bo'lgan maxsus object type (batafsil bu yerda). Input type e'lon qilish uchun @InputType() dekoratoridan foydalaning.
1import { InputType, Field } from '@nestjs/graphql';
2
3@InputType()
4export class UpvotePostInput {
5 @Field()
6 postId: number;
7}@InputType() dekoratori argument sifatida opsiyalar obyektini qabul qiladi, shuning uchun, masalan, input type tavsifini belgilashingiz mumkin. Shuni yodda tutingki, TypeScript metadata reflection tizimidagi cheklovlar tufayli, turini qo'lda ko'rsatish uchun @Field dekoratoridan foydalanishingiz yoki CLI plugindan foydalanishingiz kerak.
So'ng bu type ni resolver klassida ishlatamiz:
1@Mutation(() => Post)
2async upvotePost(
3 @Args('upvotePostData') upvotePostData: UpvotePostInput,
4) {}Schema first
Oldingi bo'limda ishlatilgan AuthorResolver ni kengaytiramiz (qarang: resolvers).
1@Mutation()
2async upvotePost(@Args('postId') postId: number) {
3 return this.postsService.upvoteById({ id: postId });
4}Yuqorida biznes mantiq PostsService ga ko'chirilgan deb faraz qildik (postni topish va votes xossasini oshirish). PostsService ichidagi mantiq ehtiyojga qarab sodda yoki murakkab bo'lishi mumkin. Bu misolning asosiy maqsadi resolvers qanday qilib boshqa providerlar bilan ishlashini ko'rsatishdir.
Oxirgi qadam - mutatsiyani mavjud types definitionga qo'shish.
1type Author {
2 id: Int!
3 firstName: String
4 lastName: String
5 posts: [Post]
6}
7
8type Post {
9 id: Int!
10 title: String
11 votes: Int
12}
13
14type Query {
15 author(id: Int!): Author
16}
17
18type Mutation {
19 upvotePost(postId: Int!): Post
20}upvotePost(postId: Int!): Post mutatsiyasi endi ilovamizning GraphQL API si tarkibida chaqirilishi mumkin.