GraphQL integratsiyasi
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-ramkaexpress-graphql: GraphQL HTTP serverini yaratish uchun o‘rta dasturgraphql: 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!
