خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

نحوه ساخت API GraphQL با سرور Apollo و MongoDB

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

یکی از مهم ترین عواملی که باید در هنگام طراحی یک برنامه در نظر گرفت، نوع معماری API مورد استفاده است. طراحی کارآمد API برای اطمینان از عملکرد برنامه‌ها در طول چرخه عمرشان بسیار مهم است.

معماری RESTful محبوب ترین رویکرد است، اما یک اشکال مهم دارد: ساختار نقطه پایانی ثابت که داده های از پیش تعیین شده را برمی گرداند. این طراحی می تواند منجر به ارتباطات ناکارآمد شود.

در مقابل، GraphQL – جایگزینی برای REST – با اجازه دادن به شما در درخواست فقط داده‌های مورد نیاز، انعطاف‌پذیری بیشتری را ارائه می‌دهد.

API های GraphQL چیست؟

GraphQL یک زبان پرس و جو است که می توانید از آن برای نوشتن API های Backend (Application Programming Interfaces) استفاده کنید. برخلاف API های REST که چندین نقطه پایانی برای داده های مختلف دارند، API های GraphQL فقط یک نقطه ورودی دارند.

مشتریان می توانند داده های مورد نیاز خود را در جستارهای خود از این نقطه ورودی واحد مشخص کنند و آن را برای بازیابی فقط داده های ضروری انعطاف پذیرتر و کارآمدتر می کند.

تصویری که دو وب سرور مستقر در یک شبکه را نشان می دهد

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

در اینجا یک تفکیک ساده از اجزای ضروری معماری GraphQL API آورده شده است:

  1. طرحواره: طرحواره توصیفی از انواع داده ها و عملیاتی است که API ارائه می دهد. اساساً، یک طرح واره ساختار داده های موجود و نوع پرس و جوها و جهش هایی را که مشتری می تواند برای اصلاح داده ها اجرا کند را تعریف می کند.
  2. Queries: مشتریان از query ها برای واکشی داده ها از پایگاه داده با مشخص کردن ساختار داده های مورد نیاز خود استفاده می کنند. علاوه بر این، آنها می توانند چندین پرس و جو را در یک درخواست HTTP قرار دهند تا داده های مرتبط را از چندین نقطه پایانی واکشی کنند.
  3. جهش: جهش ها عملیاتی هستند که برای تغییر داده ها در پایگاه داده استفاده می شوند. مشتریان می توانند درخواست های جهش برای ایجاد، به روز رسانی یا حذف داده ها ارسال کنند.
مطلب مرتبط:   نحوه استفاده از Bash برای به هم پیوستن رشته ها

یک پایگاه داده MongoDB راه اندازی کنید

برای شروع، یک پایگاه داده MongoDB ایجاد کنید. از طرف دیگر، می توانید یک کلاستر MongoDB را به صورت رایگان در فضای ابری راه اندازی کنید. هنگامی که پایگاه داده خود را راه اندازی کردید، رشته URI اتصال پایگاه داده MongoDB را کپی کنید.

می توانید کد این پروژه را در مخزن GitHub آن پیدا کنید.

یک سرور آپولو ایجاد کنید

Apollo Server یک پیاده سازی سرور GraphQL محبوب است که به شما امکان می دهد API های GraphQL را در محیط های جاوا اسکریپت از جمله Node.js، Express و غیره بسازید.

یک دایرکتوری برای یک پروژه جدید ایجاد کنید و سی دی در آن ایجاد کنید:

mkdir graphql-API-mongoDB
cd graphql-API-mongoDB

بعد، یک پروژه Node.js جدید را مقداردهی اولیه کنید.

npm init --yes

این دستور یک فایل package.json ایجاد می کند.

Required Dependencies را نصب کنید

برای نصب بسته ها دستور زیر را اجرا کنید.

npm install apollo-server graphql mongoose

در نهایت یک فایل index.js در دایرکتوری اصلی پروژه خود ایجاد کنید.

سرور آپولو را راه اندازی کنید

index.js را باز کنید و کد زیر را اضافه کنید:

const { ApolloServer } = require('apollo-server');
const mongoose = require('mongoose');
const typeDefs = require("./graphql/typeDefs");
const resolvers = require("./graphql/resolvers");

const server = new ApolloServer({
    typeDefs,
    resolvers
});

const MONGO_URI = 'mongodb://localhost:27017';

mongoose
  .connect(MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => {
    console.log(`Db Connected`);
    return server.listen({ port: 5000 });
  })
  .then((res) => {
    console.log(`Server running at ${res.url}`);
  })
  .catch(err => {
    console.log(err.message);
  });

این کد یک سرور GraphQL محلی را با استفاده از کتابخانه Apollo Server راه اندازی می کند. سپس یک اتصال به پایگاه داده MongoDB با URI اتصال داده شده برقرار می کند.

توجه کنید که چگونه کد دو آرگومان را به نمونه جدید ApolloServer ارسال می کند: typeDefs و solvers. اینها انواع داده ها و عملیاتی را که GraphQL API می تواند اجرا کند مشخص می کند.

پس از راه اندازی اتصال به پایگاه داده MongoDB، سرور شروع به گوش دادن به پورت 5000 می کند.

مدل داده را تعریف کنید

یک پوشه جدید در پوشه اصلی پوشه پروژه خود ایجاد کنید و نام آن را مدل بگذارید. در این پوشه یک فایل جدید با نام dataModel.js ایجاد کنید و کد زیر را به آن اضافه کنید:

const {model, Schema} = require('mongoose');

const employeeSchema = new Schema({
    name: String,
    department: String,
    salary: String,
});

module.exports = model('Employee', employeeSchema);

طرح واره GraphQL را تعریف کنید

یک طرحواره GraphQL ساختار داده هایی را که می توانید با استفاده از GraphQL API پرس و جو کنید، تعریف می کند. این طرح همچنین پرس و جوها و جهش هایی را که API می تواند اجرا کند را مشخص می کند. می‌توانید از کوئری‌ها برای واکشی داده‌ها و جهش‌ها برای اصلاح آن‌ها استفاده کنید.

مطلب مرتبط:   3 روش آسان برای عبور از لیست های پایتون

در پوشه اصلی پروژه خود، یک پوشه جدید ایجاد کنید و نام آن را graphql بگذارید. داخل این پوشه دو فایل typeDefs.js و solvers.js اضافه کنید

کد زیر را در فایل typeDefs.js اضافه کنید:

const {gql} = require("apollo-server");

const typeDefs = gql`
  type Employee {
    id: ID!
    name: String
    department: String
    salary: String
  }
  input EmployeeInput {
    name: String
    department: String
    salary: String
  }
  type Query {
    getEmployee(id: ID): Employee #return Employee by id
    employees: [Employee] #return array of Employees
  }
  type Mutation {
    createEmployee(employeeInput: EmployeeInput): Employee
    updateEmployee(id: ID, employeeInput: EmployeeInput): Boolean
    deleteEmployee(id: ID): Boolean
  }
`;

module.exports = typeDefs;

این کد بالا از تابع gql ارائه شده توسط بسته apollo-server برای ایجاد یک طرح GraphQL برای داده های Employee استفاده می کند.

طرحواره از چهار عنصر اصلی تشکیل شده است: انواع داده برای اطلاعات کارکنان، انواع ورودی، پرس و جوها و جهش هایی که API می تواند انجام دهد.

Resolvers را برای GraphQL API تعریف کنید

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

کد زیر را به فایل solvers.js در پوشه graphql اضافه کنید. حل کننده ها، در این مورد، در اشیاء Query و Mutation مشخص می شوند.

شی Query دو روش را تعریف می‌کند: کارکنان و getEmployee. این روش ها مسئول واکشی داده های کارمندان از پایگاه داده در صورت درخواست مشتری هستند.

const Employee= require("../models/employeesModel");

// GraphQL Resolvers
const resolvers = {
  Query: {
    employees: async () => {
      try {
        const employees = await Employee.find({});
        return employees;
      } catch (error) {
        console.error(error);
        throw new Error('Failed to fetch employees');
      }
    },
    getEmployee: async (parent, args) => {
      try {
        const employee = await Employee.findById(args.id);
        return employee;
      } catch (error) {
        console.error(error);
        throw new Error('Failed to fetch employee by ID');
      }
    },
  },

شی Mutation سه روش دارد: createEmployee، updateEmployee و deleteEmployee. این روش ها تغییراتی را در داده های ذخیره شده در پایگاه داده MongoDB ایجاد می کنند.

  Mutation: {
    async createEmployee (_, { employeeInput: { name, department, salary } }) {
      const newEmployee = new Employee({
        name: name,
        department: department,
        salary: salary
      });

      const response = await newEmployee.save();
      console.log(newEmployee);

      return {
        id: response._id,
        ...response._doc
      }
    },

    async updateEmployee (_, {id, employeeInput: {name, department, salary}}) {
      const updatedEmployee = await Employee.updateOne(
        { _id: id },
        { name, department, salary }
      );

      if (!updatedEmployee) {
        throw new Error(`Employee with ID: ${id} not found`);
      }

      return true; // Return a boolean value indicating update success
    },

    async deleteEmployee (_, {id}) {
      const deletedEmployee = await Employee.deleteOne({ _id: id });
        
      if (!deletedEmployee || deletedEmployee.deletedCount === 0) {
          throw new Error(`Employee with ID ${id} not found`);
      }

      return true; // Return a boolean value indicating deletion success
    },
 },
};

module.exports = resolvers;

در نهایت این دستور را برای چرخش سرور اجرا کنید:

node index.js

هنگامی که یک اتصال پایگاه داده برقرار کرد، سرور روی پورت 5000 راه اندازی می شود.

مطلب مرتبط:   آیا می خواهید کدنویسی اولیه را یاد بگیرید؟ 5 برنامه کدنویسی به اندازه بایت که باید در اوقات فراغت خود امتحان کنید

می‌توانید با درخواست‌های HTTP از زمین بازی GraphQL در مرورگر خود، عملکرد GraphQL API را آزمایش کنید.

به عنوان مثال، می توانید از جهش createEmployee برای اضافه کردن داده های جدید کارکنان در پایگاه داده MongoDB استفاده کنید.

پیاده سازی GraphQL API در مرورگر با استفاده از سرویس گیرنده زمین بازی GraphQL

محبوبیت GraphQL در انجمن توسعه دهندگان

GraphQL به عنوان یک رویکرد طراحی جایگزین API برای معماری محبوب REST، در جامعه توسعه دهندگان مورد توجه قرار گرفته است.

این به دلیل توانایی آن در ارائه روشی انعطاف‌پذیرتر و کارآمدتر برای بازیابی داده‌ها از منابع مختلف، همه از یک نقطه ورودی است. این امر از مدیریت چندین نقطه پایانی برای داده‌های مختلف جلوگیری می‌کند، که مشکلی رایج در معماری REST API است. این راه حل طراحی فرآیند ساخت و مدیریت API های باطن را ساده می کند.