آموزش GraphQL برای ساخت APIهای مدرن

تاریخ: 1404/7/13 ساعت: 17:53 بازدید: 41

GraphQL چیست و چرا باید از آن استفاده کنیم؟

GraphQL یک زبان پرس و جو و یک محیط اجرای داده برای API ها است. برخلاف REST، که به شما یک ساختار داده ثابت برمی گرداند، GraphQL به شما امکان می دهد دقیقاً داده مورد نیاز خود را درخواست کنید. این امر منجر به API های کارآمدتر و قابل پیش بینی تر می شود.

تصور کنید می خواهید اطلاعات کاربری را از یک API دریافت کنید. با REST، ممکن است یک endpoint مانند `/users/123` داشته باشید که یک پاسخ JSON با تمام اطلاعات کاربر برمی گرداند، حتی اگر فقط به نام و ایمیل نیاز داشته باشید. با GraphQL، شما می توانید یک پرس و جو ارسال کنید که فقط نام و ایمیل را درخواست می کند:

  
  query {
  user(id: 123) {
  name
  email
  }
  }
  
  

این پرس و جو دقیقاً داده مورد نظر شما را برمی گرداند، بدون هیچ گونه اطلاعات اضافی.

مزایای GraphQL نسبت به REST

  • دریافت دقیق داده ها: فقط داده مورد نیاز خود را درخواست کنید.
  • کاهش حجم داده: با حذف داده های اضافی، حجم داده های ارسالی از سرور کاهش می یابد.
  • کاهش تعداد درخواست ها: با GraphQL می توانید چندین منبع را در یک درخواست دریافت کنید.
  • توسعه سریعتر: Schema قوی GraphQL به شما کمک می کند خطاها را سریعتر شناسایی کنید.
  • ابزارهای قدرتمند: GraphQL دارای ابزارهای توسعه دهنده عالی مانند GraphiQL است.

مفاهیم کلیدی GraphQL

  • Schema: یک قرارداد بین کلاینت و سرور که انواع داده و نحوه دسترسی به آنها را تعریف می کند.
  • Query: یک درخواست برای دریافت داده از سرور.
  • Mutation: یک درخواست برای تغییر داده در سرور.
  • Resolver: یک تابع که نحوه دریافت داده برای یک فیلد خاص را تعریف می کند.
  • Type: نوع داده ای که یک فیلد می تواند داشته باشد (مانند String، Int، Boolean، Object).

راه اندازی یک سرور GraphQL با Node.js و Express

برای شروع، به 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 پیچیده تر

اکنون یک 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: ایجاد و ویرایش داده ها

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` اضافه می کند.

سوالات متداول (FAQ)

  • GraphQL چیست؟

    GraphQL یک زبان پرس و جو برای API ها است که به شما امکان می دهد دقیقاً داده مورد نیاز خود را درخواست کنید.

  • تفاوت GraphQL و REST چیست؟

    REST یک معماری است در حالی که GraphQL یک زبان پرس و جو است. GraphQL به شما امکان می دهد داده های مورد نیاز خود را دقیقاً درخواست کنید، در حالی که REST معمولاً تمام داده ها را برمی گرداند.

  • چه زمانی باید از GraphQL استفاده کنم؟

    زمانی که نیاز به انعطاف پذیری بیشتر در API خود دارید و می خواهید حجم داده های ارسالی را کاهش دهید، GraphQL گزینه مناسبی است.

  • GraphQL چه چالش هایی دارد؟

    GraphQL می تواند پیچیده تر از REST باشد و نیاز به ابزارهای توسعه دهنده خاصی دارد. همچنین مدیریت N+1 problem می تواند چالش برانگیز باشد.

آیا به دنبال پیاده سازی GraphQL در پروژه های خود هستید؟ تیم متخصص ما آماده است تا به شما در طراحی و توسعه APIهای مدرن و کارآمد کمک کند. همین امروز با ما تماس بگیرید: 09190994063 - 09376846692

نظرات کاربران