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);
}
Ниже приведены позиционные аргументы и их описание -
Sr.No. | Аргументы и описание |
---|---|
1 | root Объект, который содержит результат, возвращенный преобразователем в родительском поле. |
2 | args Объект с аргументами, переданными в поле запроса. |
3 | context Это объект, используемый всеми распознавателями в конкретном запросе. |
4 | info Он содержит информацию о состоянии выполнения запроса, включая имя поля, путь к полю от корня. |
Формат результата резолвера
Резольверы в GraphQL могут возвращать различные типы значений, как указано ниже -
Sr.No. | Аргументы и описание |
---|---|
1 | null or undefined это означает, что объект не может быть найден |
2 | array это допустимо только в том случае, если схема указывает, что результатом поля должен быть список |
3 | promise преобразователи часто выполняют асинхронные действия, такие как выборка из базы данных или серверного API, поэтому они могут возвращать обещания |
4 | scalar or object преобразователь также может возвращать другие значения |
Иллюстрация
Давайте создадим простое приложение для понимания резольвера. Это создаст схему для запроса студента по идентификатору с сервера. Данные учеников будут храниться в плоском файле, и мы будем использовать модуль узла под названиемnotarealdb для подделки базы данных и чтения из плоского файла.
Ниже приведен пошаговый процесс создания простого приложения.
Шаг 1 - Загрузите и установите необходимые зависимости для проекта
Создайте папку с именем resolver-app. Измените свой каталог наresolver-appс терминала. Позже выполните шаги с 3 по 5 в главе «Настройка среды».
Шаг 2 - Создайте схему
Добавьте файл schema.graphql в приложение-преобразователь папки проекта и добавьте следующий код -
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!который показывает поле уникального идентификатора, не допускающее значения NULL. Поле студентов возвращает массив студентов, а приветствие возвращает простое строковое значение.
Шаг 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 - это преобразователи, которые обрабатывают запрос.students resolver functionвозвращает список студентов из уровня доступа к данным. Чтобы получить доступ к функциям распознавателя вне модуля, объект Query должен быть экспортирован с помощью 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"
}
}
}