GraphQL - ตัวแก้ไข
Resolver คือชุดของฟังก์ชันที่สร้างการตอบสนองสำหรับแบบสอบถาม GraphQL พูดง่ายๆคือตัวแก้ไขทำหน้าที่เป็นตัวจัดการแบบสอบถาม GraphQL ทุกฟังก์ชันตัวแก้ไขในสคีมา GraphQL ยอมรับสี่อาร์กิวเมนต์ตำแหน่งตามที่ระบุด้านล่าง -
fieldName:(root, args, context, info) => { result }
ตัวอย่างของฟังก์ชันตัวแก้ไขแสดงอยู่ด้านล่าง -
//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);
}
ด้านล่างนี้เป็นอาร์กิวเมนต์ตำแหน่งและคำอธิบาย -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | root อ็อบเจ็กต์ที่มีผลลัพธ์ที่ส่งคืนจากตัวแก้ไขบนฟิลด์พาเรนต์ |
2 | args วัตถุที่มีอาร์กิวเมนต์ส่งผ่านเข้าไปในเขตข้อมูลในแบบสอบถาม |
3 | context นี่คือออบเจ็กต์ที่ใช้ร่วมกันโดยตัวแก้ปัญหาทั้งหมดในแบบสอบถามหนึ่ง ๆ |
4 | info ประกอบด้วยข้อมูลเกี่ยวกับสถานะการดำเนินการของแบบสอบถามรวมถึงชื่อเขตข้อมูลเส้นทางไปยังเขตข้อมูลจากราก |
รูปแบบผลลัพธ์ Resolver
Resolvers ใน GraphQL สามารถส่งคืนค่าประเภทต่างๆตามที่ระบุด้านล่าง -
ซีเนียร์ | อาร์กิวเมนต์และคำอธิบาย |
---|---|
1 | null or undefined สิ่งนี้บ่งชี้ว่าไม่พบวัตถุ |
2 | array จะใช้ได้เฉพาะในกรณีที่สคีมาระบุว่าผลลัพธ์ของฟิลด์ควรเป็นรายการ |
3 | promise ตัวแก้ไขมักจะดำเนินการแบบอะซิงโครนัสเช่นการดึงข้อมูลจากฐานข้อมูลหรือ API แบ็กเอนด์ดังนั้นจึงสามารถคืนสัญญาได้ |
4 | scalar or object ตัวแก้ไขยังสามารถคืนค่าอื่น ๆ |
ภาพประกอบ
ให้เราสร้างแอปพลิเคชั่นง่ายๆเพื่อทำความเข้าใจตัวแก้ไข สิ่งนี้จะสร้างสคีมาสำหรับการสืบค้นนักเรียนโดยใช้รหัสจากเซิร์ฟเวอร์ ข้อมูลนักเรียนจะถูกเก็บไว้ในไฟล์แบบแบนและเราจะใช้โมดูลโหนดที่เรียกว่าnotarealdb เพื่อปลอมฐานข้อมูลและอ่านจากไฟล์แบบแบน
ต่อไปนี้เป็นกระบวนการที่ชาญฉลาดในการสร้างแอปพลิเคชันง่ายๆ -
ขั้นตอนที่ 1 - ดาวน์โหลดและติดตั้งการอ้างอิงที่จำเป็นสำหรับโครงการ
สร้างโฟลเดอร์ชื่อ resolver-app. เปลี่ยนไดเร็กทอรีของคุณเป็นresolver-appจากขั้ว ต่อมาทำตามขั้นตอนที่ 3 ถึง 5 ในบทการตั้งค่าสภาพแวดล้อม
ขั้นตอนที่ 2 - สร้างสคีมา
เพิ่มไฟล์ schema.graphql ในโฟลเดอร์โปรเจ็กต์ resolver-app และเพิ่มรหัสต่อไปนี้ -
type Query {
greeting:String
students:[Student]
studentById(id:ID!):Student
}
type Student {
id:ID!
firstName:String
lastName:String
password:String
collegeId:String
}
แสดงให้เห็นว่าสคีไฟล์ที่ผู้ใช้สามารถสอบถามทักทายนักเรียนและstudentById ในการดึงข้อมูลนักเรียนที่มีรหัสเฉพาะเราใช้data type ID!ซึ่งแสดงฟิลด์ตัวระบุเฉพาะที่ไม่เป็นโมฆะ นักเรียนข้อมูลส่งกลับอาร์เรย์ของนักเรียนและทักทายผลตอบแทนค่าสตริงที่เรียบง่าย
ขั้นตอนที่ 3 - สร้างตัวแก้ไข
สร้างไฟล์ resolvers.js ในโฟลเดอร์โครงการและเพิ่มรหัสต่อไปนี้ -
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}
ที่นี่studentByIdใช้พารามิเตอร์สามตัว ดังที่กล่าวไว้ในบทนี้studentIdสามารถดึงมาจาก args; root จะมีวัตถุ Query เอง ในการส่งคืนนักเรียนที่ระบุเราจำเป็นต้องเรียกใช้เมธอด get ด้วยพารามิเตอร์ id ในคอลเล็กชันนักเรียน
นี่ทักทายนักเรียน studentByIdมี resolvers ที่จัดการแบบสอบถามstudents resolver functionส่งคืนรายชื่อนักเรียนจากชั้นการเข้าถึงข้อมูล ในการเข้าถึงฟังก์ชั่นตัวแก้ไขภายนอกโมดูลต้องส่งออกอ็อบเจ็กต์เคียวรีโดยใช้ module.exports
ขั้นตอนที่ 4 - เรียกใช้แอปพลิเคชัน
สร้างไฟล์ server.js อ้างถึงขั้นตอนที่ 8 ในบทการตั้งค่าสภาพแวดล้อม ดำเนินการคำสั่ง npm start ในเทอร์มินัล เซิร์ฟเวอร์จะทำงานบนพอร์ต 9000 ที่นี่เราใช้ GraphiQL เป็นไคลเอนต์เพื่อทดสอบแอปพลิเคชัน
เปิดเบราว์เซอร์และป้อน url http://localhost:9000/graphiql. พิมพ์คำค้นหาต่อไปนี้ในตัวแก้ไข -
{
studentById(id:"S1001") {
id
firstName
lastName
}
}
ผลลัพธ์สำหรับแบบสอบถามด้านบนมีดังที่แสดงด้านล่าง -
{
"data": {
"studentById": {
"id": "S1001",
"firstName": "Mohtashim",
"lastName": "Mohammad"
}
}
}