GraphQL - Trình phân giải
Resolver là một tập hợp các hàm tạo phản hồi cho một truy vấn GraphQL. Nói một cách dễ hiểu, một trình phân giải hoạt động như một trình xử lý truy vấn GraphQL. Mọi hàm phân giải trong lược đồ GraphQL chấp nhận bốn đối số vị trí như được đưa ra bên dưới:
fieldName:(root, args, context, info) => { result }
Dưới đây là một ví dụ về các hàm của trình phân giải:
//resolver function with no parameters and returning string
greeting:() => {
return "hello from TutorialsPoint !!!"
}
//resolver function with no parameters and returning list
students:() => db.students.list()
//resolver function with arguments and returning object
studentById:(root,args,context,info) => {
return db.students.get(args.id);
}
Dưới đây là các đối số vị trí và mô tả của chúng -
Sr.No. | Lập luận & Mô tả |
---|---|
1 | root Đối tượng chứa kết quả được trả về từ trình phân giải trên trường mẹ. |
2 | args Một đối tượng với các đối số được truyền vào trường trong truy vấn. |
3 | context Đây là một đối tượng được chia sẻ bởi tất cả các trình phân giải trong một truy vấn cụ thể. |
4 | info Nó chứa thông tin về trạng thái thực thi của truy vấn, bao gồm tên trường, đường dẫn đến trường từ gốc. |
Định dạng kết quả trình phân giải
Trình phân giải trong GraphQL có thể trả về các loại giá trị khác nhau như được cung cấp bên dưới:
Sr.No. | Lập luận và mô tả |
---|---|
1 | null or undefined điều này cho thấy không thể tìm thấy đối tượng |
2 | array điều này chỉ hợp lệ nếu lược đồ chỉ ra rằng kết quả của một trường phải là một danh sách |
3 | promise trình phân giải thường thực hiện các hành động không đồng bộ như tìm nạp từ cơ sở dữ liệu hoặc API phụ trợ, vì vậy chúng có thể trả về các lời hứa |
4 | scalar or object một trình phân giải cũng có thể trả về các giá trị khác |
Hình minh họa
Hãy để chúng tôi tạo một ứng dụng đơn giản để hiểu về trình giải quyết. Thao tác này sẽ tạo lược đồ để truy vấn sinh viên theo id từ máy chủ. Dữ liệu sinh viên sẽ được lưu trữ trong một tệp phẳng và chúng tôi sẽ sử dụng một mô-đun nút được gọi lànotarealdb để giả mạo cơ sở dữ liệu và đọc từ tệp phẳng.
Sau đây là quy trình từng bước để tạo một ứng dụng đơn giản -
Bước 1 - Tải xuống và cài đặt các phụ thuộc bắt buộc cho dự án
Tạo một thư mục có tên resolver-app. Thay đổi thư mục của bạn thànhresolver-apptừ thiết bị đầu cuối. Sau đó, hãy làm theo các bước từ 3 đến 5 trong chương Thiết lập Môi trường.
Bước 2 - Tạo một lược đồ
Thêm tệp schema.graphql trong ứng dụng giải quyết thư mục dự án và thêm mã sau:
type Query {
greeting:String
students:[Student]
studentById(id:ID!):Student
}
type Student {
id:ID!
firstName:String
lastName:String
password:String
collegeId:String
}
Tệp lược đồ cho thấy người dùng có thể truy vấn lời chào, học sinh và studentById . Để truy xuất các sinh viên có id cụ thể, chúng tôi sử dụngdata type ID!hiển thị trường định danh duy nhất không thể nullable. Trường sinh viên trả về một mảng sinh viên và lời chào trả về một giá trị chuỗi đơn giản.
Bước 3 - Tạo trình phân giải
Tạo một tệp resolvers.js trong thư mục dự án và thêm mã sau:
const db = require('./db')
const Query = {
//resolver function for greeting
greeting:() => {
return "hello from TutorialsPoint !!!"
},
//resolver function for students returns list
students:() => db.students.list(),
//resolver function for studentbyId
studentById:(root,args,context,info) => {
//args will contain parameter passed in query
return db.students.get(args.id);
}
}
module.exports = {Query}
Ở đây, studentById nhận vào ba tham số. Như đã thảo luận trong chương này, studentId có thể được truy xuất từ args; root sẽ chứa chính đối tượng Query. Để trả về một sinh viên cụ thể, chúng ta cần gọi phương thức get với tham số id trong tập hợp sinh viên.
Ở đây xin chào, sinh viên, studentById là trình phân giải xử lý truy vấn.students resolver functiontrả về danh sách sinh viên từ lớp truy cập dữ liệu. Để truy cập các chức năng của trình phân giải bên ngoài mô-đun, đối tượng Truy vấn phải được xuất bằng module.exports.
Bước 4 - Chạy ứng dụng
Tạo tệp server.js. Tham khảo bước 8 trong Chương Thiết lập Môi trường. Thực hiện lệnh npm start trong terminal. Máy chủ sẽ hoạt động trên cổng 9000. Ở đây, chúng tôi sử dụng GraphiQL làm máy khách để kiểm tra ứng dụng.
Mở trình duyệt và nhập url, http://localhost:9000/graphiql. Nhập truy vấn sau vào trình soạn thảo -
{
studentById(id:"S1001") {
id
firstName
lastName
}
}
Đầu ra cho truy vấn trên như được hiển thị bên dưới:
{
"data": {
"studentById": {
"id": "S1001",
"firstName": "Mohtashim",
"lastName": "Mohammad"
}
}
}