Комплексное руководство
Введение:
В мире современной веб-разработки GraphQL приобрел значительную популярность благодаря своей гибкости и эффективности получения данных. В сочетании с мощной базой данных, такой как MongoDB, и таким инструментом, как Apollo Server, у вас есть рецепт создания надежных и производительных API. В этом сообщении блога мы рассмотрим шаги по созданию API GraphQL CRUD с использованием Apollo Server и MongoDB, используя предоставленный код в качестве основы.
Шаг 1: Настройка среды
Для начала убедитесь, что на вашем компьютере установлены Node.js и npm (менеджер пакетов Node). Создайте новый каталог для своего проекта и перейдите к нему с помощью терминала.
mkdir graphql-crud cd graphql-crud
Шаг 2. Установка зависимостей
В каталоге вашего проекта инициализируйте новый проект Node.js, выполнив:
npm init -y
Далее установите необходимые пакеты: mongoose, graphql, graphql-tag и @apollo/server.
npm install mongoose graphql graphql-tag @apollo/server
Шаг 3. Определение модели данных
В файле models/student.js вы найдете модель данных Mongoose для сущности Student. Сюда входят такие поля, как firstName, lastName и age. Mongoose — это инструмент объектного моделирования MongoDB, который предоставляет решение для моделирования данных на основе схемы.
const mongoose = require("mongoose");
const Student = mongoose.model("Student", {
firstName: String,
lastName: String,
age: Number,
});
module.exports = { Student };
Шаг 4. Создание определений типов GraphQL
В models/typedefs.js вы определяете схему GraphQL, используя тег gql из пакета graphql-tag. Эта схема определяет структуру вашего API, включая типы (Student, Query, Mutation) и соответствующие им поля.
const gql = require("graphql-tag");
const typeDefs = gql`
type Query {
greetings: String
welcome(name: String!): String
students: [Student] # return array of students
student(id: ID): Student # return student by ID
}
# student object
type Student {
id: ID
firstName: String
lastName: String
age: Int
}
# post request (Mutation)
type Mutation {
create(firstName: String, lastName: String, age: Int): Student
update(id: ID, firstName: String, lastName: String, age: Int): Student
delete(id: ID): Student
}
`;
module.exports = { typeDefs };
Схема определяет доступные запросы и мутации. Тип Query включает в себя такие поля, как greetings (возвращает строку), welcome (принимает параметр имени и возвращает строку), students (возвращает массив типа Student) и student (принимает параметр ID и возвращает одного Student). Тип Mutation включает в себя такие операции, как create (принятие параметров firstName, LastName и возраста для создания нового учащегося), update (принятие параметров ID, FirstName, LastName и возраста для обновления учащегося) и delete (принятие параметра ID для удаления). студент). Тип Student имеет поля для идентификатора, имени, фамилии и возраста. Эта схема определяет структуру данных, которые можно запрашивать или изменять с помощью операций GraphQL.
Шаг 5. Реализация резольверов
В resolvers.js вы найдете функции преобразователя для определенных запросов и мутаций. Резолверы отвечают за выборку и обработку данных из ваших источников данных, в данном случае MongoDB с использованием Mongoose. Резолверы Query обрабатывают чтение данных, а резолверы Mutation обрабатывают создание, обновление и удаление данных.
const { Student } = require("./models/Student");
const resolvers = {
Query: {
greetings: () => "GraphQL is Awesome",
welcome: (parent, args) => `Hello ${args.name}`,
students: async () => await Student.find({}),
student: async (parent, args) => await Student.findById(args.id),
},
Mutation: {
create: async (parent, args) => {
const { firstName, lastName, age } = args;
const newStudent = new Student({ firstName, lastName, age });
await newStudent.save();
return newStudent;
},
update: async (parent, args) => {
const { id } = args;
const result = await Student.findByIdAndUpdate(id, args);
return result;
},
delete: async (parent, args) => {
const { id } = args;
const deletedStudent = await Student.findByIdAndDelete(id);
if (!deletedStudent) {
throw new Error(`Stdent with ID ${id} not found`);
}
return deletedStudent;
},
},
};
module.exports = { resolvers };
Эти преобразователи определяют, как обрабатываются операции GraphQL и какие данные они должны возвращать. Раздел преобразователей «Запрос» включает функции для запросов: «приветствия» возвращает фиксированную строку «GraphQL is Awesome», «welcome» принимает аргумент имени и возвращает персонализированное приветствие, «студенты» используют модель «Студент» для получения все учащиеся из источника данных, а «студент» использует модель «Студент», чтобы найти учащегося по предоставленному ему идентификатору. В разделе «Мутация» определяются функции для мутаций: «создать» создает нового студента с использованием аргументов, сохраняет его в источнике данных и возвращает нового студента, «обновление» изменяет студента по его идентификатору и предоставленным аргументам и «удаляет». » удаляет учащегося по его идентификатору и предоставляет отзыв или сообщение об ошибке, если учащегося не существует. В целом, эти преобразователи позволяют взаимодействовать с данными учащихся посредством операций GraphQL.
Шаг 6. Подключение к MongoDB
В index.js вы видите код для подключения к вашей базе данных MongoDB. Замените URI своей собственной строкой подключения MongoDB. Обязательно замените password> на свое имя пользователя и пароль MongoDB Atlas.
const mongoose = require("mongoose");
const URI =
"your-mongodb-url";
mongoose
.connect(URI)
.then(() => console.log(`database is connected`))
.catch((err) => console.log(err.message));
Шаг 7: Запуск сервера Apollo
Последний шаг — запуск сервера Apollo. В том же файле index.js создайте новый экземпляр ApolloServer, используя определенные typeDefs и resolvers. Затем используйте метод startStandaloneServer для запуска сервера на порту 4000.
const { ApolloServer } = require("@apollo/server");
const { resolvers } = require("./resolvers");
const { typeDefs } = require("./models/typeDefs");
const { startStandaloneServer } = require("@apollo/server/standalone");
const mongoose = require("mongoose");
const URI =
"your-mongodb-url";
mongoose
.connect(URI)
.then(() => console.log(`database is connected`))
.catch((err) => console.log(err.message));
const server = new ApolloServer({ typeDefs, resolvers });
startStandaloneServer(server, {
listen: { port: 4000 },
}).then(({ url }) => {
console.log(`Server is running on ${url}`);
});
Шаг 8. Тестирование конечных точек GraphQL
После настройки CRUD API GraphQL с помощью Apollo Server и MongoDB следующим шагом будет проверка функциональности вашего API. Существует несколько инструментов, которые вы можете использовать для тестирования конечных точек GraphQL.
Использование игровой площадки GraphQL
- Запустите свой сервер, запустив
node index.js. - Откройте веб-браузер и перейдите к
https://localhost:4000. - Вас встретит GraphQL Playground — интерактивный интерфейс для изучения и тестирования вашего API.
- На левой панели вы можете писать запросы и мутации в соответствии с определенной вами схемой.
- Выполняйте запросы, нажав кнопку «Играть». Вы увидите результаты на правой панели.
Использование клиента Apollo
Apollo Client — это мощная библиотека JavaScript для управления состоянием GraphQL и выполнения запросов к серверу GraphQL. Вот как вы можете использовать его для тестирования вашего API:
- Установите клиент Apollo:
npm install apollo-boost @apollo/client
- Создайте новый файл JavaScript (например,
test.js) в каталоге вашего проекта. - В
test.jsимпортируйте клиент Apollo и создайте экземпляр клиента:
const { ApolloClient, InMemoryCache } = require('@apollo/client');
const client = new ApolloClient({
uri: 'https://localhost:4000', // Your GraphQL server URL
cache: new InMemoryCache(),
});
- Напишите и выполните запросы с помощью клиента:
async function testQueries() {
const { data } = await client.query({
query: YOUR_QUERY_HERE,
});
console.log(data);
}
async function testMutations() {
const { data } = await client.mutate({
mutation: YOUR_MUTATION_HERE,
});
console.log(data);
}
testQueries();
testMutations();
Примеры запросов и мутаций:
Создать:
mutation {
create(firstName: "John", lastName: "Doe", age: 20) {
id
firstName
lastName
age
}
}
Читать:
query {
students {
id
firstName
lastName
age
}
}
обновление:
mutation {
update(id: "student_id_here", firstName: "UpdatedFirstName", age: 21) {
id
firstName
lastName
age
}
}
удалить:
mutation {
delete(id: "student_id_here") {
id
firstName
lastName
age
}
}
Использование Почтальона
- Откройте Postman и создайте новый запрос.
- Установите тип запроса
POSTи введите URL-адресhttps://localhost:4000. - В теле запроса выберите опцию «raw» и установите тип контента
application/json. - Напишите запрос или мутацию GraphQL в теле запроса:
{
"query": "YOUR_QUERY_OR_MUTATION_HERE"
}
Заключение
Поздравляем! Вы успешно настроили API-интерфейс GraphQL CRUD с использованием Apollo Server и MongoDB. Используя эту основу, вы можете расширить свой API, добавив больше типов, полей и преобразователей для удовлетворения конкретных потребностей вашего приложения. Гибкость GraphQL позволяет клиентам запрашивать именно те данные, которые им нужны, что делает его эффективным выбором для современной веб-разработки. А благодаря MongoDB в качестве хранилища данных вы получаете в свое распоряжение мощную базу данных NoSQL.
Спасибо, что дочитали до конца. Пожалуйста, подумайте о том, чтобы подписаться на автора и эту публикацию. Посетите Stackademic, чтобы узнать больше о том, как мы демократизируем бесплатное образование в области программирования во всем мире.