---
description: https://viblo.asia/p/tim-hieu-graphql-L4x5xpVm5BM
---

# Tìm hiểu GraphQL



## Tìm hiểu GraphQL

This post has been more than **2 years** since it was last updated.

## GraphQL là gì <a href="#graphql-la-gi-0" id="graphql-la-gi-0"></a>

Được Facebook giới thiệu cùng với Relay tại React.js Conf 2015, GraphQL là một ngôn ngữ query cho API dùng để viết các câu API một cách uyển chuyển chính xác những gì cần có, trong các application hiện đại nhiều lớp với nhiều thành phần phụ thuộc được sử dụng ngày càng phổ biến hiện nay. Trên thực tế GraphQL đã được sử dụng từ vài năm trước trong ứng dụng trên mobile của Facebook.

## Đặc điểm của GraphQL <a href="#dac-diem-cua-graphql-1" id="dac-diem-cua-graphql-1"></a>

Client truy vấn đến máy chủ GraphQL bằng các truy vấn với đặc điểm: format của dữ liệu trả về được mô tả trong câu truy vấn và được định nghĩa ở phía client thay vì ở server. Nói đơn giản hơn, đây là truy vấn hướng client, cấu trúc dữ liệu không khô cứng 1 khuôn mẫu từ server (REST API) mà thay đổi theo từng ngữ cảnh sao cho hiệu quả nhất đối với client mà chỉ cần dùng duy nhất 1 endpoint.![](https://images.viblo.asia/13a7d270-bb5c-4307-9e96-3da6218101d3.png)

## Điểm mạnh của GraphQL <a href="#diem-manh-cua-graphql-2" id="diem-manh-cua-graphql-2"></a>

Lấy Facebook làm ví dụ. Facebook phải quản lí vô số data source và API clients mà REST API lại lộ khuyết điểm thiếu linh hoạt do tính chất dựa trên tài nguyên cố định, dẫn đến trường hợp “nghẽn cổ chai” thường thấy. Chính vì vậy, thay vì có đến hàng tá “endpoint” dư thừa, Facebook đã nghĩ đến giải pháp chỉ dùng một “endpoint” thông minh với khả năng tiếp thu những Query phức tạp rồi đưa ra output data với loại type tùy theo yêu cầu của client. Nói đơn giản hơn, đây là truy vấn hướng client, cấu trúc dữ liệu không khô cứng 1 khuôn mẫu từ server (REST API) mà thay đổi theo từng ngữ cảnh sao cho hiệu quả nhất đối với client Ngoài ra, GraphQL hoàn toàn có thể create, update, delete, nhưng với cấu trúc sáng sủa và cấu trúc phân tầng nên lại càng thuận lợi cho lập trình viên phía client![](https://images.viblo.asia/b87cdd83-6bd2-4941-b9cf-d9be2a8e9457.jpg)

## Xu hướng của GraphQL <a href="#xu-huong-cua-graphql-3" id="xu-huong-cua-graphql-3"></a>

![](https://images.viblo.asia/46dd243b-51d9-4797-9823-30e655401fab.png)Biểu đồ của Google Trends cho thấy Graphql đang có xu hướng tăng đều trong thời gian qua chứng tỏ Graphql đang phát triển tốt. Mặc dù Graphql không quá nóng bỏng như các frontend React/Vue/Angular với lượng người sử dụng lớn, nhưng điều đó không có nghĩa là Graphql nhận được ít sự quan tâm của mọi người

## Bắt đầu với GraphQL <a href="#bat-dau-voi-graphql-4" id="bat-dau-voi-graphql-4"></a>

Để có cái nhìn đơn giản đầu tiên với GraphQL ta sẽ sử dụng module GraphQL server với apollo-server-express và graphql-tools

Trước tiên máy bạn phải cài sẵn node js tiếp đó sẽ cài đặt các module sau thông qua npm $ npm install –save apollo-server-express graphql-tools graphql express body-parser

Ta sẽ tạo file server.js với nội dung sau:

```
const express = require('express');
 
const bodyParser = require('body-parser');
 
const { graphqlExpress, graphiqlExpress } = require('apollo-server-express');
 
const { makeExecutableSchema } = require('graphql-tools');
 
 
 
// fake data
 
const laptops = [
 
  {
 
    name: "MacBookPro",
 
    ram: "16GB",
 
    cpu: "i7 7700HQ",
 
    price:9000000
 
  },
 
  {
 
    name: "Lenovo",
 
    ram: "16GB",
 
    cpu: "i5 7200U",
 
    price:8000000
 
  },
 
  {
 
    name: "HP",
 
    ram: "32GB",
 
    cpu: "i7 7700HQ",
 
    price:5000000
 
  },
 
 
 
];
 
 
 
// The GraphQL schema in string form
 
const typeDefs = `
 
  type Query { laptops: [Laptop] }
 
  type Laptop { name: String, cpu: String, ram: String, price: Float,}`;
 
 
 
// The resolvers
 
const resolvers = {
 
  Query: { laptops: () => laptops },
 
};
 
 
 
// Put together a schema
 
const schema = makeExecutableSchema({
 
  typeDefs,
 
  resolvers,
 
});
 
 
 
// Initialize the app
 
const app = express();
 
 
 
// The GraphQL endpoint
 
app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));
 
 
 
// GraphiQL, a visual editor for queries
 
app.use('/graphiql', graphiqlExpress({ endpointURL: '/graphql' }));
 
 
 
// Start the server
 
app.listen(3000, () => {
 
  console.log('Go to https://localhost:3000/graphiql to run queries!');
 
});
```

Và tiến hành chạy lệnh $node server.js, tiếp sau đó từ trình duyệt sẽ truy cập vào địa chỉ [https://localhost:3000/graphiql](https://localhost:3000/graphiql) ![](https://images.viblo.asia/012fc795-39b1-47d2-9424-e83ed34a42d5.png) Từ màn hình trên ta có thể tra cứu các lệnh truy vấn ![](https://images.viblo.asia/6a8d3f78-7b1a-45c5-85c4-74a266b28dcb.png) Ngoài ra ta có thể xem được các trường ta muốn lấy về mà không cần lấy hết khiến dư thừa dữ liệu ![](https://images.viblo.asia/b2427d64-02ff-49b7-803d-81350503010c.png)

Ta thực hiện lệnh Get thông tin về danh sách laptop tuy nhiên ta thấy laptop có 4 trường nhưng ta chỉ cần hiển thị 2 trường thì lệnh Get sẽ viết như sau![](https://images.viblo.asia/1103f635-3624-4046-b5bf-5dfad1d377eb.png)Như vậy ta đã lấy được tên và giá của sản phẩm

Qua ví dụ đơn giản trên phần nào mình chỉ giới thiệu cho các bạn cái nhìn đầu tiên và cách sử dụng GraphQL để thực hiện thêm các hành động khác như update, delete , insert Các bạn có thể tham khảo thêm ở địa chỉ [https://graphql.org/graphql-js/](https://graphql.org/graphql-js/)

## Các tool và extensions tuyệt vời cho GraphQL APIs <a href="#cac-tool-va-extensions-tuyet-voi-cho-graphql-apis-5" id="cac-tool-va-extensions-tuyet-voi-cho-graphql-apis-5"></a>

Để thuận tiện trong việc sử dụng mình xin giới thiệu 1 vài tool cơ bản để giúp các bạn nhanh chóng kết nối ứng dụng của mình với GraphQL

1. GraphiQL :Là công cụ mình đã giới thiệu bên trên, sử dụng trình duyệt được xây dựng dựa trên React, GraphiQL cũng có thể được nối với CSS cho việc xây dựng tùy chỉnh.
2. GraphQL Voyager : Thể hiện GraphQL API dưới dạng biểu đồ tương tác giúp các bạn nhìn thấy mối tương quan giữa các dữ liệu
3. Graph CMS : Xây dựng một GraphQL Content API trong vài phút GraphCMS là một hệ thống quản lý nội dung (CMS) API mà gắn liền với GraphQL.
4. GraphQL Docs : Tài liệu ngắn gọn dễ hiểu cho GraphQL API Cần một tài liệu tĩnh cho giản đồ GraphQL API
5. Graphcool : Back-end hỗ trợ linh hoạt kết hợp GraphQL + AWS Lambda Với kiến trúc linh hoạt, khả năng mở rộng, không cần máy chủ, có một back-end được hình thành trước là một triển vọng thú vị.
