GraphQL предлага гъвкава алтернатива на класическия REST подход, когато изграждате API.

Един от най-важните фактори, които трябва да вземете предвид при проектирането на приложение, е типът API архитектура, която да използвате. Ефективният дизайн на API е от решаващо значение за гарантиране, че приложенията са производителни през целия си жизнен цикъл.

Архитектурата RESTful е най-популярният подход, но има един значителен недостатък: фиксирана структура на крайната точка, която връща предварително определени данни. Този дизайн може да доведе до неефективна комуникация.

За разлика от това, GraphQL – алтернатива на REST – предлага повече гъвкавост, като ви позволява да изисквате само данните, от които се нуждаете.

Какво представляват GraphQL API?

GraphQL е език за заявки, който можете да използвате за писане на backend API (интерфейси за програмиране на приложения). За разлика от API на REST, които имат множество крайни точки за различни данни, GraphQL API имат само една входна точка.

Клиентите могат да определят данните, от които се нуждаят в своите заявки, от тази единна входна точка, което я прави по-гъвкава и ефективна за извличане само на необходимите данни.

instagram viewer

Просто казано, API на GraphQL реализира архитектурата на GraphQL, описана от GraphQL спецификации. Този дизайн включва дефиниране на схемата, заявките и мутациите, с които клиентите могат да взаимодействат.

Ето опростена разбивка на основните компоненти на GraphQL API архитектурата:

  1. Схема: Схемата е описание на типовете данни и операции, които API предоставя. По принцип схемата дефинира структурата на наличните данни и вида на заявките и мутациите, които клиентът може да изпълни, за да модифицира данните.
  2. Заявки: Клиентите използват заявки за извличане на данни от базата данни, като посочват структурата на данните, които изискват. Освен това те могат да вложат множество заявки в една HTTP заявка, за да извлекат свързани данни от множество крайни точки.
  3. Мутации: Мутациите са операции, използвани за модифициране на данни в базата данни. Клиентите могат да изпращат заявки за мутация за създаване, актуализиране или изтриване на данни.

Настройте база данни MongoDB

За да започнете, създайте база данни MongoDB. Като алтернатива можете настройте MongoDB клъстер в облака безплатно.След като настроите вашата база данни, копирайте URI низа за връзка с базата данни на MongoDB.

Можете да намерите кода на този проект в него GitHub хранилище.

Създайте сървър на Apollo

Apollo сървър е популярна сървърна реализация на GraphQL, която ще ви позволи да изградите GraphQL API в среди на JavaScript, включително Node.js, Express и др.

Създайте директория за нов проект и cd в него:

mkdir graphql-API-mongoDB
cd graphql-API-mongoDB

След това инициализирайте нов проект Node.js.

npm init --yes

Тази команда създава a package.json файл.

Инсталирайте необходимите зависимости

Изпълнете следната команда, за да инсталирате пакетите.

npm инсталирайте apollo-сървър graphql mongoose

Накрая създайте index.js файл в основната директория на вашия проект.

Настройте сървъра Apollo

Отворете index.js и добавете кода по-долу:

конст { ApolloServer } = изискват("apollo-сървър");
конст мангуста = изискват("мангуста");
конст typeDefs = изискват("./graphql/typeDefs");
конст преобразуватели = изискват("./graphql/resolvers");

конст сървър = нов ApolloServer({
typeDefs,
резолвери
});

конст MONGO_URI = 'mongodb://localhost: 27017';

мангуста
.connect (MONGO_URI, {
useNewUrlParser: вярно,
useUnifiedTopology: вярно,
})
.тогава(() => {
конзола.log(„Db свързан“.);
връщане server.listen({ порт: 5000 });
})
.тогава((рез) => {
конзола.log(`Сървърът работи на ${res.url}`);
})
.catch(грешка => {
конзола.log (съобщение за грешка);
});

Този код инициализира локален GraphQL сървър, използвайки библиотеката на Apollo Server. След това установява връзка към база данни MongoDB с дадения URI на връзката.

Забележете как кодът предава два аргумента към новото копие на ApolloServer: typeDefs и resolvers. Те определят типовете данни и операциите, които GraphQL API може да изпълни.

След като връзката към базата данни MongoDB е настроена, сървърът започва да слуша на порт 5000.

Дефинирайте модела на данни

Създайте нова папка в основната директория на папката на вашия проект и я наименувайте модели. В тази папка създайте нови имена на файлове dataModel.js и добавете следния код към него:

конст {модел, схема} = изискват("мангуста");

конст Схема на служител = нов Схема ({
име: низ,
отдел: низ,
заплата: низ,
});

модул.exports = модел("Служител", схема на служител);

Дефинирайте схемата GraphQL

Схемата на GraphQL дефинира структурата на данните, които можете да правите заявки с помощта на GraphQL API. Схемата също така очертава заявките и мутациите, които API може да изпълнява. Можете да използвате заявки за извличане на данни и мутации, за да ги промените.

В главната директория на вашия проект създайте нова папка и я наименувайте graphql. В тази папка добавете два файла: typeDefs.js и resolvers.js

Добавете кода по-долу във файла typeDefs.js:

конст {gql} = изискват("apollo-сървър");

конст typeDefs = gql`
тип Служител {
направих!
име: низ
отдел: низ
заплата: низ
}
вход EmployeeInput {
име: низ
отдел: низ
заплата: низ
}
тип Query {
getEmployee (id: ID): Служител #връщане Служител по идент
служители: [Служител] #връщане масив на служители
}
тип мутация {
createEmployee (employeeInput: EmployeeInput): Служител
updateEmployee (id: ID, employeeInput: EmployeeInput): Булева стойност
deleteEmployee (id: ID): Булева стойност
}
`;

модул.exports = typeDefs;

Този код по-горе използва gql функция, предоставена от пакета apollo-server за създаване на GraphQL схема за данните на служителите.

Схемата се състои от четири основни елемента: типове данни за информация за служителите, типове входни данни, заявки и мутации, които API може да извърши.

Дефинирайте преобразувателите за GraphQL API

Резолверът е функция на GraphQL, която дефинира данните, които да бъдат предадени, когато клиент изпрати API заявка за извличане на данни. По същество основната му роля е да извлече необходимите данни от посочения източник на данни и да ги върне на клиента.

Добавете кода по-долу към resolvers.js файл в graphql папка. Резолверите в този случай са посочени в обектите Query и Mutation.

Обектът Query дефинира два метода: служители и getEmployee. Тези методи отговарят за извличането на данни за служителите от базата данни при поискване от клиент.

конст Служител= изискват("../models/employeesModel");

// Резолвери на GraphQL
конст преобразуватели = {
Заявка: {
служители: асинхронен () => {
опитвам {
конст служители = изчакайте Employee.find({});
връщане служители;
} улов (грешка) {
конзола.error (грешка);
хвърлямновГрешка(„Неуспешно извличане на служители“);
}
},
getEmployee: асинхронен (родител, аргументи) => {
опитвам {
конст служител = изчакайте Employee.findById (args.id);
връщане служител;
} улов (грешка) {
конзола.error (грешка);
хвърлямновГрешка(„Неуспешно извличане на служител по ID“);
}
},
},

Обектът Mutation има три метода: createEmployee, updateEmployee, и изтрийСлужител. Тези методи правят промени в данните, съхранявани в базата данни MongoDB.

 Мутация: {
асинхронен createEmployee (_, { employeeInput: { име, отдел, заплата } }) {
конст новСлужител = нов Служител({
име: име,
отдел: отдел,
заплата: заплата
});

конст отговор = изчакайте newEmployee.save();
конзола.log (нов служител);

връщане {
id: response._id,
...отговор._doc
}
},

асинхронен updateEmployee (_, {id, employeeInput: {име, отдел, заплата}}) {
конст актуализиранСлужител = изчакайте Employee.updateOne(
{ _документ за самоличност: документ за самоличност },
{ име, отдел, заплата }
);

ако (!updatedEmployee) {
хвърлямновГрешка(`Служител с ID: ${id} не е намерен`);
}

връщаневярно; // Връща булева стойност, показваща успех на актуализацията
},

асинхронен deleteEmployee (_, {id}) {
конст изтрит служител = изчакайте Employee.deleteOne({ _документ за самоличност: документ за самоличност });

ако (!deletedEmployee || deletedEmployee.deletedCount 0) {
хвърлямновГрешка(`Служител с лична карта ${id} не е намерен`);
}

връщаневярно; // Връща булева стойност, показваща успех на изтриването
},
 },
};

модул.exports = преобразуватели;

Накрая изпълнете тази команда, за да завъртите сървъра:

възел index.js

След като установи връзка с база данни, сървърът ще стартира на порт 5000.

Можете да продължите напред и да тествате функционалността на GraphQL API, като направите HTTP заявки от игралната площадка на GraphQL във вашия браузър.

Например, можете да използвате createEmployee мутация за добавяне на нови данни за служители в базата данни MongoDB.

Популярност на GraphQL в общността на разработчиците

GraphQL набира популярност в общността на разработчиците като алтернативен API подход към популярната REST архитектура.

Това се дължи на способността му да предоставя по-гъвкав и ефективен начин за извличане на данни от различни източници, всички от една входна точка. Това избягва да се налага да управлявате множество крайни точки за различни данни, което е често срещан проблем с REST API архитектурата. Това дизайнерско решение рационализира процеса на изграждане и управление на backend API.