/ / Cách xây dựng API GraphQL với Máy chủ Apollo và MongoDB

Cách xây dựng API GraphQL với Máy chủ Apollo và MongoDB

Một trong những yếu tố quan trọng nhất cần xem xét khi thiết kế ứng dụng là loại kiến ​​trúc API sẽ sử dụng. Thiết kế API hiệu quả là rất quan trọng trong việc đảm bảo rằng các ứng dụng hoạt động hiệu quả trong suốt vòng đời của chúng.


Kiến trúc RESTful là cách tiếp cận phổ biến nhất, nhưng nó có một nhược điểm đáng kể: cấu trúc điểm cuối cố định trả về dữ liệu được xác định trước. Thiết kế này có thể dẫn đến giao tiếp không hiệu quả.

Ngược lại, GraphQL—một giải pháp thay thế cho REST—cung cấp tính linh hoạt hơn bằng cách cho phép bạn chỉ yêu cầu dữ liệu bạn cần.


API GraphQL là gì?

GraphQL là ngôn ngữ truy vấn mà bạn có thể sử dụng để viết API phụ trợ (Giao diện lập trình ứng dụng). Không giống như API REST có nhiều điểm cuối cho các dữ liệu khác nhau, API GraphQL chỉ có một điểm vào.

Khách hàng có thể chỉ định dữ liệu họ cần trong các truy vấn của họ từ điểm nhập duy nhất này, giúp việc truy xuất chỉ những dữ liệu cần thiết trở nên linh hoạt và hiệu quả hơn.

Hình minh họa cho thấy hai máy chủ web được triển khai trong một mạng

Nói một cách đơn giản, API GraphQL triển khai kiến ​​trúc GraphQL được mô tả bởi thông số kỹ thuật của GraphQL. Thiết kế này liên quan đến việc xác định lược đồ, truy vấn và đột biến mà khách hàng có thể tương tác.

Dưới đây là bảng phân tích đơn giản về các thành phần thiết yếu của kiến ​​trúc GraphQL API:

  1. Lược đồ: Lược đồ là một mô tả về các loại dữ liệu và hoạt động mà API cung cấp. Về cơ bản, lược đồ xác định cấu trúc của dữ liệu có sẵn và loại truy vấn cũng như thay đổi mà khách hàng có thể thực hiện để sửa đổi dữ liệu.
  2. Truy vấn: Khách hàng sử dụng truy vấn để tìm nạp dữ liệu từ cơ sở dữ liệu bằng cách chỉ định cấu trúc của dữ liệu mà họ yêu cầu. Ngoài ra, họ có thể lồng nhiều truy vấn vào một yêu cầu HTTP để tìm nạp dữ liệu liên quan từ nhiều điểm cuối.
  3. Đột biến: Đột biến là các hoạt động được sử dụng để sửa đổi dữ liệu trên cơ sở dữ liệu. Khách hàng có thể gửi yêu cầu đột biến để tạo, cập nhật hoặc xóa dữ liệu.

Thiết lập cơ sở dữ liệu MongoDB

Để bắt đầu, hãy tạo cơ sở dữ liệu MongoDB. Ngoài ra, bạn có thể thiết lập miễn phí cụm MongoDB trên đám mây. Khi bạn đã thiết lập cơ sở dữ liệu của mình, hãy sao chép chuỗi URI kết nối cơ sở dữ liệu của MongoDB.

Tạo một máy chủ Apollo

Apollo Server là một triển khai máy chủ GraphQL phổ biến cho phép bạn xây dựng API GraphQL trong môi trường JavaScript, bao gồm Node.js, Express, v.v.

Tạo một thư mục cho một dự án mới và đĩa CD vào đó:

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

Tiếp theo, khởi tạo một dự án Node.js mới.

 npm init --yes 

Lệnh này tạo ra một gói.json tài liệu.

Cài đặt các phụ thuộc cần thiết

Chạy lệnh sau để cài đặt các gói.

 npm install apollo-server graphql mongoose 

Cuối cùng, tạo một index.js tập tin trong thư mục gốc của dự án của bạn.

Thiết lập máy chủ Apollo

Mở index.js và thêm đoạn mã dưới đây:

 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);
  });

Đoạn mã này khởi tạo một máy chủ GraphQL cục bộ bằng thư viện Máy chủ Apollo. Sau đó, nó thiết lập kết nối tới cơ sở dữ liệu MongoDB với URI kết nối đã cho.

Lưu ý cách mã chuyển hai đối số sang phiên bản mới của ApolloServer: typeDefs và trình phân giải. Chúng chỉ định các loại dữ liệu và hoạt động mà API GraphQL có thể thực thi.

Sau khi kết nối với cơ sở dữ liệu MongoDB được thiết lập, máy chủ bắt đầu lắng nghe trên cổng 5000.

Xác định mô hình dữ liệu

Tạo một thư mục mới trong thư mục gốc của thư mục dự án của bạn và đặt tên cho nó người mẫu. Trong thư mục này, tạo một tên tệp mới dữ liệuModel.js và thêm đoạn mã sau vào nó:

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

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

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

Xác định Lược đồ GraphQL

Lược đồ GraphQL xác định cấu trúc của dữ liệu mà bạn có thể truy vấn bằng API GraphQL. Lược đồ cũng phác thảo các truy vấn và đột biến mà API có thể chạy. Bạn có thể sử dụng các truy vấn để tìm nạp dữ liệu và các đột biến để sửa đổi dữ liệu đó.

Trong thư mục gốc của dự án của bạn, tạo một thư mục mới và đặt tên cho nó đồ thị. Trong thư mục này, thêm hai tệp: gõDefs.jstrình giải quyết.js

Thêm mã bên dưới vào tệp 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;

Đoạn mã trên sử dụng gql chức năng được cung cấp bởi gói apollo-server để tạo lược đồ GraphQL cho dữ liệu Nhân viên.

Lược đồ bao gồm bốn yếu tố chính: kiểu dữ liệu cho thông tin nhân viên, kiểu đầu vào, truy vấn và các đột biến mà API có thể thực hiện.

Xác định Bộ giải quyết cho API GraphQL

Trình phân giải là một hàm GraphQL xác định dữ liệu sẽ được truyền khi ứng dụng khách gửi truy vấn API để tìm nạp dữ liệu. Về cơ bản, vai trò chính của nó là truy xuất dữ liệu cần thiết từ nguồn dữ liệu đã chỉ định và trả lại cho máy khách.

Thêm mã dưới đây vào trình giải quyết.js tập tin trong đồ thị thư mục. Trong trường hợp này, trình phân giải được chỉ định trong các đối tượng Truy vấn và Đột biến.

Đối tượng Query định nghĩa hai phương thức: người lao độnggetEmployee. Các phương thức này chịu trách nhiệm lấy dữ liệu nhân viên từ cơ sở dữ liệu theo yêu cầu của khách hàng.

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


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');
      }
    },
  },

Đối tượng Mutation có ba phương thức: tạoNhân viên, cập nhậtNhân viênxóaNhân viên. Các phương thức này thực hiện các thay đổi đối với dữ liệu được lưu trữ trong cơ sở dữ liệu 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;
    },

    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;
    },
 },
};

module.exports = resolvers;

Cuối cùng, chạy lệnh này để khởi động máy chủ:

 node index.js 

Khi nó đã thiết lập kết nối cơ sở dữ liệu, máy chủ sẽ bắt đầu trên cổng 5000.

Bạn có thể tiếp tục và kiểm tra chức năng của GraphQL API bằng cách thực hiện các yêu cầu HTTP từ sân chơi GraphQL trong trình duyệt của mình.

Ví dụ, bạn có thể sử dụng tạoNhân viên để thêm dữ liệu nhân viên mới vào cơ sở dữ liệu MongoDB.

Triển khai API GraphQL trên trình duyệt bằng ứng dụng khách sân chơi của GraphQL

GraphQL đang thu hút sự chú ý trong cộng đồng nhà phát triển như một phương pháp thiết kế API thay thế cho kiến ​​trúc REST phổ biến.

Điều này là do khả năng cung cấp một cách linh hoạt và hiệu quả hơn để truy xuất dữ liệu từ nhiều nguồn khác nhau, tất cả từ một điểm nhập duy nhất. Điều này giúp tránh phải quản lý nhiều điểm cuối cho các dữ liệu khác nhau, đây là một vấn đề phổ biến với kiến ​​trúc API REST. Giải pháp thiết kế này hợp lý hóa quy trình xây dựng và quản lý API phụ trợ.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *