GraphQL integratsiyasi


ULASHISH

GraphQL nima?

GraphQL - bu API uchun so‘rovlar tili va ma’lumotlaringizga qarshi ushbu so‘rovlarni bajarish uchun ish vaqti. U 2012 yilda Facebook tomonidan ishlab chiqilgan va 2015 yilda ommaga e’lon qilingan.

Asosiy xususiyatlar

  • Mijoz tomonidan belgilangan so‘rovlar: Aynan o‘zingizga kerak bo‘lgan narsani so‘rang, boshqa hech narsa emas
  • Yagona so‘nggi nuqta: Barcha resurslarga bitta so‘nggi nuqta orqali kiring
  • Qat’iy tiplangan (strongly typed): Aniq sxema mavjud ma’lumotlar va operatsiyalarni belgilaydi
  • Ierarxik: so‘rovlar ma’lumotlaringiz shakliga mos keladi
  • O‘z-o‘zidan hujjatlashtirish: Sxema hujjat sifatida xizmat qiladi

Eslatma: RESTdan farqli o‘laroq, GraphQL mijozlarga kerakli ma’lumotlarni aniq belgilash imkonini beradi, bu esa ma’lumotlarning ortiqcha va kam olinishini kamaytiradi.


Node.js da GraphQL bilan ishlashni boshlash

Old shartlar

  • O‘rnatilgan Node.js (v14 yoki undan keyingi versiya tavsiya etiladi)
  • JavaScript va Node.js bo‘yicha asosiy bilimlar
  • npm yoki iplar paketi menejeri

1-qadam: Yangi loyihani sozlash

Yangi katalog yarating va Node.js loyihasini ishga tushiring:

mkdir graphql-server
cd graphql-server
npm init -y

2-qadam: Kerakli paketlarni o‘rnating

Kerakli bog‘liqliklarni o‘rnating:

npm install express express-graphql graphql

Bu o‘rnatadi:

  • express : Node.js uchun veb-ramka
  • express-graphql : GraphQL HTTP serverini yaratish uchun o‘rta dastur
  • graphql : GraphQL ning JavaScript mos yozuvlar ilovasi


3-qadam: Asosiy GraphQL serverini yarating

3.1 Ma’lumotlar modelingizni aniqlang

Yangi server.js fayl yarating va GraphQL sxemasini aniqlash tili (SDL) yordamida ma’lumotlar modelingizni aniqlashdan boshlang:

const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');

// Sample data
const books = [
  {
    id: '1',
    title: 'The Great Gatsby',
    author: 'F. Scott Fitzgerald',
    year: 1925,
    genre: 'Novel'
  },
  {
    id: '2',
    title: 'To Kill a Mockingbird',
    author: 'Harper Lee',
    year: 1960,
    genre: 'Southern Gothic'
  }
];

3.2 GraphQL sxemasini aniqlang

server.js faylingizga sxema ta’rifini qo‘shing:

// Define the schema using GraphQL schema language
const schema = buildSchema(`
  # A book has a title, author, and publication year
  type Book {
    id: ID!
    title: String!
    author: String!
    year: Int
    genre: String
  }

  # The "Query" type is the root of all GraphQL queries
  type Query {
    # Get all books
    books: [Book!]!
    # Get a specific book by ID
    book(id: ID!): Book
    # Search books by title or author
    searchBooks(query: String!): [Book!]!
  }
`);

3.3 Resolverlarni amalga oshirish

Haqiqiy ma’lumotlarni olish uchun hal qiluvchi funksiyalarni qo‘shing:

// Define resolvers for the schema fields
const root = {
  // Resolver for fetching all books
  books: () => books,
  
  // Resolver for fetching a single book by ID
  book: ({ id }) => books.find(book => book.id === id),
  
  // Resolver for searching books
  searchBooks: ({ query }) => {
    const searchTerm = query.toLowerCase();
    return books.filter(
      book =>
        book.title.toLowerCase().includes(searchTerm) ||
        book.author.toLowerCase().includes(searchTerm)
    );
  }
};

3.4 Ekspress serverni sozlash

Serverni sozlashni yakunlang:

// Create an Express app
const app = express();

// Set up the GraphQL endpoint
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  // Enable the GraphiQL interface for testing
  graphiql: true,
}));

// Start the server
const PORT = 4000;
app.listen(PORT, () => {
  console.log(`Server running at http://localhost:${PORT}/graphql`);
});

4-qadam: GraphQL serveringizni ishga tushiring va sinab ko‘ring

4.1 Serverni ishga tushiring

Serveringizni Node.js bilan ishga tushiring:

node server.js

Siz xabarni ko‘rishingiz kerak: Server running at http://localhost:4000/graphql

4.2 GraphiQL bilan sinov

Brauzeringizni oching va GraphiQL interfeysiga kirish uchun http://localhost:4000/graphql ga o‘ting.

Misol so‘rovi: Barcha kitoblarni oling
{
  books {
    id
    title
    author
    year
  }
}
Misol so‘rovi: Yagona kitob oling
{
  book(id: "1") {
    title
    author
    genre
  }
}
Misol so‘rovi: Kitoblarni qidirish
{
  searchBooks(query: "Gatsby") {
    title
    author
    year
  }
}

Mutatsiyalar bilan ishlash

Mutatsiyalar serverdagi ma’lumotlarni o‘zgartirish uchun ishlatiladi. Keling, kitoblarni qo‘shish, yangilash va o‘chirish imkoniyatini qo‘shaylik.

1. Sxemani yangilang

Mutatsiya turini sxemangizga qo‘shing:

const schema = buildSchema(`
  # ... (previous types remain the same) ...

  # Input type for adding/updating books
  input BookInput {
    title: String
    author: String
    year: Int
    genre: String
  }

  type Mutation {
    # Add a new book
    addBook(input: BookInput!): Book!
    # Update an existing book
    updateBook(id: ID!, input: BookInput!): Book
    # Delete a book
    deleteBook(id: ID!): Boolean
  }
`);

2. Mutatsion rezolverlarni amalga oshirish

Mutation resolverlarini o‘z ichiga olishi uchun root resolver obyektini yangilang:

const root = {
  // ... (previous query resolvers remain the same) ...

  // Mutation resolvers
  addBook: ({ input }) => {
    const newBook = {
      id: String(books.length + 1),
      ...input
    }
    books.push(newBook);
    return newBook;
  },

  updateBook: ({ id, input }) => {
    const bookIndex = books.findIndex(book => book.id === id);
    if (bookIndex === -1) return null;

    const updatedBook = {
      ...books[bookIndex],
      ...input
    }
    books[bookIndex] = updatedBook;
    return updatedBook;
  },

  deleteBook: ({ id }) => {
    const bookIndex = books.findIndex(book => book.id === id);
    if (bookIndex === -1) return false;

    books.splice(bookIndex, 1);
    return true;
  }
};

3. Mutatsiyalarni tekshirish

Yangi kitob qo‘shing

mutation {
  addBook(input: {
    title: "1984"
    author: "George Orwell"
    year: 1949
    genre: "Dystopian"
  }) {
    id
    title
    author
  }
}

Kitobni yangilash

mutation {
  updateBook(
    id: "1"
    input: { year: 1926 }
  ) {
    title
    year
  }
}

Kitobni o‘chirish

mutation {
  deleteBook(id: "2")
}

Eng yaxshi amaliyotlar

1. Xatolarni boshqarish

Rezervatorlaringizdagi xatolarni har doim to‘g‘ri hal qiling:

const root = {
  book: ({ id }) => {
    const book = books.find(book => book.id === id);
    if (!book) {
      throw new Error('Book not found');
    }
    return book;
  },
  // ... other resolvers
}

2. Ma’lumotlarni tekshirish

Qayta ishlashdan oldin kiritilgan ma’lumotlarni tasdiqlang:

const { GraphQLError } = require('graphql');

const root = {
  addBook: ({ input }) => {
    if (input.year && (input.year < 0 || input.year > new Date().getFullYear() + 1)) {
      throw new GraphQLError('Invalid publication year', {
        extensions: { code: 'BAD_USER_INPUT' }
      }
    }
    // ... rest of the resolver
  }
};

3. N+1 muammo

Ma’lumotlar bazasi so‘rovlarini ommaviy va keshlash uchun DataLoader-dan foydalaning:

npm install dataloader
const DataLoader = require('dataloader');

// Create a loader for books
const bookLoader = new DataLoader(async (ids) => {
  // This would be a database query in a real app
  return ids.map(id => books.find(book => book.id === id));
});

const root = {
  book: ({ id }) => bookLoader.load(id),
  // ... other resolvers
};

Keyingi qadamlar

  • Haqiqiy ma’lumotlar bazasiga ulaning (MongoDB, PostgreSQL va boshqalar)
  • Autentifikatsiya va avtorizatsiyani amalga oshiring
  • Haqiqiy vaqtda yangilanishlar uchun obunalarni qo‘shing
  • Kengaytirilgan funksiyalar uchun Apollo Server bilan tanishing
  • Mikroservislar uchun sxemalarni tikish va federatsiya haqida bilib oling

Maslahat: Qayta foydalanish va xavfsizlikni yaxshilash uchun GraphQL operatsiyalarida har doim o‘zgaruvchilardan foydalaning.


GraphQL sxemalari va turlari

GraphQL sxemalari sizning API tuzilmangizni va so‘ralishi mumkin bo‘lgan ma’lumotlar turlarini belgilaydi.

Tizim turi

GraphQL ma’lumotlaringiz shaklini aniqlash uchun tip tizimidan foydalanadi. Bu yerda asosiy skalyar turlari mavjud:

Turi Tavsif Misol
Int Imzolangan 32 bitli tamsayı 42
Float Imzolangan ikki aniqlikdagi suzuvchi nuqta qiymati 3.14
String UTF-8 belgilar ketma-ketligi "Hello, GraphQL!"
Boolean rost yoki yolg‘on true, false
ID String sifatida seriyalashtirilgan noyob identifikator "5f8a8d8e8f8c8d8b8a8e8f8c"



W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!