Thứ năm, 12/12/2019 | 00:00 GMT+7

Cách xây dựng server GraphQL trong Node.js bằng GraphQL-yoga và MongoDB

Hầu hết các ứng dụng ngày nay đều có nhu cầu tìm nạp dữ liệu từ một server nơi dữ liệu đó được lưu trữ trong database . GraphQL là một tiêu chuẩn API mới cung cấp một giải pháp thay thế hiệu quả, mạnh mẽ và linh hoạt hơn cho REST. Nó cho phép client chỉ tìm nạp dữ liệu mà nó cần từ server .


GraphQL thường bị nhầm lẫn với việc là một công nghệ database , nhưng theo ông là một quan niệm sai lầm, GraphQL là một ngôn ngữ truy vấn cho các API, không phải database . Theo nghĩa đó, database đó là bất khả tri và được dùng hiệu quả trong bất kỳ ngữ cảnh nào mà API được sử dụng.

graphql-yoga là Server GraphQL đầy đủ tính năng tập trung vào tính dễ sử dụng, hiệu suất và trải nghiệm tuyệt vời dành cho nhà phát triển. Ngoài ra, nó hỗ trợ tất cả các client GraphQL như Apollo.

Đến đây bạn đã hiểu GraphQL là gì, bạn có thể học cách sử dụng nó trong các ứng dụng Nodejs của bạn thay cho REST.

Tạo một dự án mới

Tạo một folder mới có tên là UsersAPI, mở terminal của bạn và chuyển vào folder , sau đó chạy lệnh sau:

  • npm init

Tạo một file có tên index.js bên trong folder dự án của bạn:

  • touch index.js

Điều đó sẽ chăm sóc cài đặt ứng dụng của bạn.

Cài đặt Phụ thuộc Bắt buộc

Bạn cần cài đặt graphql-yoga để giúp cài đặt server GraphQL và sau đó mongoose để được trợ giúp kết nối với database Mongo của bạn.

Bên trong terminal của bạn chạy như sau:

  • npm install graphql-yoga mongoose

Xác định mô hình user

Mô hình chịu trách nhiệm tạo và đọc tài liệu từ database MongoDB bên dưới. Tại đây, ta sẽ tạo mô hình User cho ứng dụng GraphQL của ta .

Bên trong index.js nhập các dòng mã sau:

const { GraphQLServer } = require('graphql-yoga')
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/UserApp");


const User= mongoose.model("User",{
    fullname: String,
    username: String,
    phone_number: String,
    city: String
});

Ta đã xác định thành công mô hình User của bạn và cài đặt kết nối mongoose, đã đến lúc vào Lược đồ GraphQL.

Xác định một schemas GraphQL

Lược đồ GraphQL mô tả chức năng có sẵn cho các client kết nối với nó. Nó được xây dựng bằng cách sử dụng Ngôn ngữ Định nghĩa Lược đồ.

Thêm các dòng mã sau vào index.js của bạn:

const typeDefs = `type Query {
    getUser(id: ID!): User
    getUsers: [User]
  }
  type User {
      id: ID!
      fullname: String!
      username: String!
      phone_number: String!
      city: String!
  }
  type Mutation {
      addUser(fullname: String!, username: String!, phone_number: String!, city: String!): User!,
      deleteUser(id: ID!): String
  }`

Ta có ba loại bên trong Lược đồ của ta , hãy chia nhỏ chúng.

Sử dụng loại truy vấn

Truy vấn GraphQL là để tìm nạp dữ liệu và so sánh với động từ GET trong các API dựa trên REST.
Để xác định những truy vấn nào có thể thực hiện được trên một server , loại Truy vấn được sử dụng trong Ngôn ngữ Định nghĩa Lược đồ. Kiểu truy vấn là kiểu cấp root xác định chức năng cho client và hoạt động như một điểm vào cho các kiểu cụ thể hơn khác trong schemas .

type Query {
    getUser(id: ID): User
    getUsers: [User]
}

Trong loại Truy vấn này, ta xác định hai loại truy vấn có sẵn trên server GraphQL này:
getUser: trả về một đối tượng User cụ thể phù hợp với ID được cung cấp.
getUsers: trả về danh sách các đối tượng User .

Nếu bạn đã quen với các API dựa trên REST, thông thường bạn sẽ thấy các API này nằm trên các điểm cuối riêng biệt, nhưng GraphQL cho phép chúng được truy vấn cùng lúc và trả về cùng một lúc.

Lưu ý: Dấu ngoặc vuông biểu thị rằng bạn mong đợi một đối tượng có thể lặp lại hoặc một mảng trong phản hồi JSON. Bạn sẽ chỉ trả về một đối tượng User duy nhất cho getUser và một mảng cho getUsers.

Sử dụng Kiểu user

User là Loại đối tượng GraphQL, nghĩa là loại có một số trường. Kiểu đối tượng là kiểu phổ biến nhất được sử dụng trong schemas và đại diện cho một group trường.

type User {
    id: ID!
    fullname: String!
    username: String!
    phone_number: String!
    city: String!
}

id, fullname, username, phone_number và city là các trường trên Kiểu user .

  • Chuỗi là một trong những kiểu vô hướng được tích hợp sẵn. Nó chỉ định kiểu dữ liệu của một trường.
  • Chuỗi nghĩa là trường không thể null. Trong Ngôn ngữ Định nghĩa Lược đồ, ta sẽ biểu diễn những từ này bằng dấu chấm than.
  • ID là một định danh duy nhất, thường được sử dụng làm khóa cho bộ nhớ cache.

Sử dụng loại đột biến

Các đột biến được gửi đến server để tạo, cập nhật hoặc xóa dữ liệu tương tự như các động từ PUT, POST, PATCH và DELETE trên các API RESTful.
Giống như cách kiểu Truy vấn xác định các điểm nhập cho các hoạt động tìm nạp dữ liệu trên server GraphQL, kiểu Mutation cấp root chỉ định các điểm nhập cho các hoạt động thao tác dữ liệu.

type Mutation {
    addUser(fullname: String!, username: String!, phone_number: String!, city: String!): User!,
    deleteUser(id: ID!): String
}

Điều này thực hiện hai đột biến:

  • addUser : chấp nhận tên đầy đủ, tên user , phone_number và city dưới dạng các đối số được gọi là "loại đầu vào" và đột biến sẽ trả về đối tượng User mới được tạo.
  • deleteUser : chấp nhận ID user hợp lệ và trả về một thông báo Chuỗi để cho biết thao tác xóa có thành công hay không.

Hãy chuyển sang viết Trình phân giải cho Lược đồ đã xác định của ta .

Thêm trình phân giải

Bộ phân giải là các chức năng thực tế để triển khai logic nghiệp vụ trên dữ liệu trong API GraphQL. Mỗi truy vấn và đột biến sẽ có các hàm phân giải tương ứng để thực hiện logic.

Thêm các dòng mã sau vào index.js của bạn:

const resolvers = {
    Query: {
      getUsers: ()=> User.find(),
      getUser: async (_,{id}) => {
        var result = await User.findById(id);
        return result;
    }
},
    Mutation: {
        addUser: async (_, { fullname, username, phone_number, city }) => {
            const user = new User({fullname, username, phone_number, city});
            await user.save();
            return user;
        },
        deleteUser: async (_, {id}) => {
            await User.findByIdAndRemove(id);
            return "User deleted";
        }
    }
  }

Cài đặt Server GraphQL của bạn

Sau khi xây dựng Lược đồ và Bộ phân giải, đã đến lúc cài đặt server của bạn để xử lý các yêu cầu. graphql-yoga là cách dễ nhất để cài đặt và chạy server GraphQL, đây là một Server GraphQL đầy đủ tính năng tập trung vào cấu hình thân thiện với user , hiệu suất và trải nghiệm tuyệt vời dành cho nhà phát triển.

Bên trong index.js , thêm các dòng mã sau để cài đặt server của bạn:

const server = new GraphQLServer({ typeDefs, resolvers })
mongoose.connection.once("open", function(){
    server.start(() => console.log('Server is running on localhost:4000'))
});

Như vậy, bạn đã xây dựng một server GraphQL chức năng từ đầu, đã đến lúc thực hiện một số yêu cầu. Mở terminal của bạn và chạy lệnh sau để khởi động server :

node index.js

Mở trình duyệt web và chuyển đến http: // localhost: 4000 / một playground GraphQL đẹp sẽ xuất hiện trên trình duyệt của bạn, nơi bạn có thể chạy các truy vấn mẫu.

Thêm user mới

Chạy truy vấn sau bên trong playground để thêm user mới:

mutation{
  addUser(fullname:"Ibe Ogele",username:"ibesoft",phone_number:"2348102331921",city:"Enugu"){
    id
    fullname
    username
    phone_number
    city
  }
}

Tìm nạp thông tin user

Chạy truy vấn bên dưới để tìm nạp thông tin cho một user cụ thể:

query{
  getUser(id:"user_id"){
    id
    fullname
    username
    phone_number
    city
  }
}

Để tất cả User chạy:

query{
  getUsers{
    id
    fullname
    username
    phone_number
    city
  }
}

Xóa user

Bạn có thể xóa một User cụ thể bằng cách chạy truy vấn bên dưới:

mutation{
  deleteUser(id: "user_id")
}

Kết luận

Với GraphQL, bạn gửi một truy vấn đến API của bạn và nhận được chính xác những gì bạn cần, không hơn không kém. Các truy vấn GraphQL luôn trả về kết quả có thể dự đoán được.


Tags:

Các tin liên quan

Cách thiết lập server GraphQL trong Node.js với server Apollo và Sequelize
2019-12-12
Cách sử dụng Ansible để tự động thiết lập server ban đầu trên Ubuntu 18.04
2019-11-27
Cách sử dụng Ansible để tự động thiết lập server ban đầu trên Ubuntu 18.04
2019-11-27
Cách sử dụng Ansible để tự động thiết lập server ban đầu trên Ubuntu 18.04
2019-11-27
Sử dụng Sự kiện do server gửi trong Node.js để tạo ứng dụng thời gian thực
2019-11-18
Cách thiết lập front-end server PageKite trên Debian 9
2019-10-25
Cách thiết lập server trang kết thúc phía trước PageKite trên Debian 9
2019-10-25
Cách cài đặt Linux, Apache, MariaDB, PHP (LAMP) trên Debian 10
2019-07-15
Thiết lập server ban đầu với Debian 10
2019-07-08
Cách cài đặt và cấu hình Postfix làm server SMTP chỉ gửi trên Debian 10
2019-07-08