GraphQL چیست و چرا باید از آن استفاده کنیم؟
GraphQL یک زبان پرس و جو و یک محیط اجرای داده برای API ها است. برخلاف REST، که به شما یک ساختار داده ثابت برمی گرداند، GraphQL به شما امکان می دهد دقیقاً داده مورد نیاز خود را درخواست کنید. این امر منجر به API های کارآمدتر و قابل پیش بینی تر می شود.
تصور کنید می خواهید اطلاعات کاربری را از یک API دریافت کنید. با REST، ممکن است یک endpoint مانند `/users/123` داشته باشید که یک پاسخ JSON با تمام اطلاعات کاربر برمی گرداند، حتی اگر فقط به نام و ایمیل نیاز داشته باشید. با GraphQL، شما می توانید یک پرس و جو ارسال کنید که فقط نام و ایمیل را درخواست می کند:
query {
user(id: 123) {
name
email
}
}
این پرس و جو دقیقاً داده مورد نظر شما را برمی گرداند، بدون هیچ گونه اطلاعات اضافی.
برای شروع، به Node.js و npm (یا yarn) نیاز دارید. سپس می توانید با استفاده از npm یا yarn، کتابخانه های مورد نیاز را نصب کنید.
npm install express express-graphql graphql
سپس می توانید یک فایل `server.js` ایجاد کنید و کد زیر را در آن قرار دهید:
const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { buildSchema } = require('graphql');
// تعریف Schema
const schema = buildSchema(`
type Query {
hello: String
}
`);
// تعریف Resolver
const root = {
hello: () => 'Hello world!'
};
const app = express();
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
}));
app.listen(4000, () => console.log('Server running on port 4000'));
این کد یک سرور Express ایجاد می کند و GraphQL را به endpoint `/graphql` اضافه می کند. `graphiql: true` یک رابط کاربری گرافیکی را فعال می کند که می توانید برای آزمایش API خود از آن استفاده کنید.
برای اجرای سرور، دستور `node server.js` را اجرا کنید. سپس می توانید به `http://localhost:4000/graphql` در مرورگر خود بروید و API خود را تست کنید.
اکنون یک Schema پیچیده تر با انواع و فیلدهای مختلف ایجاد می کنیم:
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
content: String!
author: User!
}
type Query {
user(id: ID!): User
posts(userId: ID!): [Post]
}
`);
این Schema دو نوع `User` و `Post` را تعریف می کند. نوع `User` دارای فیلدهای `id`, `name`, `email` و `posts` است. نوع `Post` دارای فیلدهای `id`, `title`, `content` و `author` است.
همچنین دو Query به نام های `user` و `posts` تعریف شده است. Query `user` یک کاربر را بر اساس ID برمی گرداند. Query `posts` لیستی از پست های یک کاربر را بر اساس ID کاربر برمی گرداند.
سپس باید Resolver ها را برای این Schema تعریف کنیم:
const users = [
{ id: '1', name: 'John Doe', email: '[email protected]' },
{ id: '2', name: 'Jane Doe', email: '[email protected]' },
];
const posts = [
{ id: '1', title: 'GraphQL Tutorial', content: 'This is a tutorial on GraphQL.', authorId: '1' },
{ id: '2', title: 'REST vs GraphQL', content: 'A comparison of REST and GraphQL.', authorId: '1' },
{ id: '3', title: 'Node.js Best Practices', content: 'Best practices for Node.js development.', authorId: '2' },
];
const root = {
user: ({ id }) => users.find(user => user.id === id),
posts: ({ userId }) => posts.filter(post => post.authorId === userId),
};
این کد دو آرایه `users` و `posts` را تعریف می کند که داده های نمونه را ذخیره می کنند. همچنین Resolver ها برای Query های `user` و `posts` تعریف شده اند.
Mutations برای تغییر داده ها در سرور استفاده می شوند. مثال زیر یک Mutation برای ایجاد یک کاربر جدید نشان می دهد:
const schema = buildSchema(`
type User {
id: ID!
name: String!
email: String!
}
type Query {
user(id: ID!): User
}
type Mutation {
createUser(name: String!, email: String!): User
}
`);
Mutation `createUser` دو آرگومان `name` و `email` را دریافت می کند و یک کاربر جدید ایجاد می کند.
سپس باید Resolver برای این Mutation را تعریف کنیم:
const users = [];
let nextId = 1;
const root = {
user: ({ id }) => users.find(user => user.id === id),
createUser: ({ name, email }) => {
const newUser = { id: String(nextId++), name, email };
users.push(newUser);
return newUser;
}
};
این کد یک آرایه `users` را تعریف می کند که کاربران را ذخیره می کند. Resolver `createUser` یک کاربر جدید با ID منحصر به فرد ایجاد می کند و آن را به آرایه `users` اضافه می کند.
GraphQL یک زبان پرس و جو برای API ها است که به شما امکان می دهد دقیقاً داده مورد نیاز خود را درخواست کنید.
REST یک معماری است در حالی که GraphQL یک زبان پرس و جو است. GraphQL به شما امکان می دهد داده های مورد نیاز خود را دقیقاً درخواست کنید، در حالی که REST معمولاً تمام داده ها را برمی گرداند.
زمانی که نیاز به انعطاف پذیری بیشتر در API خود دارید و می خواهید حجم داده های ارسالی را کاهش دهید، GraphQL گزینه مناسبی است.
GraphQL می تواند پیچیده تر از REST باشد و نیاز به ابزارهای توسعه دهنده خاصی دارد. همچنین مدیریت N+1 problem می تواند چالش برانگیز باشد.
آیا به دنبال پیاده سازی GraphQL در پروژه های خود هستید؟ تیم متخصص ما آماده است تا به شما در طراحی و توسعه APIهای مدرن و کارآمد کمک کند. همین امروز با ما تماس بگیرید: 09190994063 - 09376846692