Направите сопствени АПИ користећи ове популарне веб технологије.

ГрапхКЛ и НестЈС чине одлично партнерство, дајући вам чврсту основу за ваше АПИ-је и оквир који се лако користи за прављење скалабилних веб апликација. Комбинација је савршена за прављење апликација спремних за производњу, а обе су веома релевантне алатке у данашњем технолошком екосистему.

Сазнајте више о томе како можете да направите АПИ користећи оба производа.

Шта је ГрапхКЛ?

ГрапхКЛ је језик за упите и манипулацију подацима можете користити за прављење АПИ-ја на прецизнији и концизнији начин. ГрапхКЛ пружа потпун и адекватан опис података који постоје у АПИ-ју и даје моћ клијенту да добије тачне податке који су потребни.

ГрапхКЛ пружа многе функције које недостају РЕСТ АПИ-ју, у распону од прецизних упита података до боље алатке за програмере, као што је грапхикл уредник. Такође вам омогућава да затражите више ресурса путем једног захтева.

Шта је НестЈС?

НестЈС је прогресивни Ноде.јс оквир који можете да користите за прављење скалабилних и ефикасних апликација на страни сервера. НестЈС пружа многе додатке, заједно са алатима за брз и лак развој, укључујући подршку за ГрапхКЛ, ГРПЦ, ВебСоцкетс, итд.

НестЈС је добро познат у екосистему по својој оптимизованој структури пројекта користећи модуле, контролере, услуге и шеме. Његов уграђени ЦЛИ вам омогућава да креирате структурирану АПИ архитектуру. Можете користити принципи убризгавања зависности да контролише како делови апликације међусобно комуницирају.

Имплементација ГрапхКЛ-а са НестЈС и МонгоДБ

Пре него што направите АПИ са НестЈС и ГрапхКЛ, мораћете да имате доступне праве зависности. Потребан вам је да инсталирате Ноде.јс и НестЈС, који можете инсталирати покретањем нпм и -г @нестјс/цли.

Пример који следи је једноставна апликација која чува информације о књигама. Покрените следећу команду у свом терминалу да бисте креирали нову НестЈС апликацију:

гнездо ново 

Идите до директоријума генерисане апликације () и инсталирајте његове зависности следећом командом:

$ нпм инсталл --саве @нестјс/цонфиг @нестјс/грапхкл грапхкл-тоолс грапхкл \
 @нестјс/аполло аполло-сервер-екпресс @нестјс/монгоосе @типес/грапхкл

Постоје два главна приступа за изградњу ГрапхКЛ АПИ-ја, наиме:

  1. Шема-први приступ: где описујете АПИ у датотекама са дефиницијама шеме или СДЛ-у, а НестЈС генерише Типесцрипт дефиниције на основу њих.
  2. Приступ први код: где дефинишете упите, мутације и друге ГрапхКЛ функционалности користећи Типесцрипт класе и декораторе, а НестЈС генерише СДЛ датотеке на основу њих.

Следећи пример описује како се користи приступ први код.

Прво, морате да иницијализујете ГрапхКЛ у свом АппМодуле и повежите га са МонгоДБ базом података:

// апп.модуле.тс
увоз { Модул } из'@нестјс/цоммон';
увоз { ГрапхКЛМодуле као НестГрапхКЛМодуле } из'@нестјс/грапхкл';
увоз { АполлоДривер, АполлоДриверЦонфиг } из'@нестјс/аполло';
увоз { придружити } из'пут';
увоз { МонгоосеМодуле} из'@нестјс/монгоосе';
увоз { АппЦонтроллер } из'./апп.цонтроллер';
увоз { АппСервице } из'./апп.сервице';
увоз { ЦонфигМодуле, ЦонфигСервице } из'@нестјс/цонфиг';
увоз монгодбЦонфиг из'./цонфиг/монгодб.цонфиг';

@Модуле({
увози: [
ЦонфигМодуле.форРоот({
лоад: [монгодбЦонфиг],
исГлобал: истина
}),
НестГрапхКЛМодуле.форРоотАсинц({
возач: АполлоДривер,
убацити: [ЦонфигСервице],
усеФацтори: асинц (цонфигСервице: ЦонфигСервице) => ({
аутоСцхемаФиле: придружи се (процесс.цвд(), 'срц/сцхема.гкл'),
инсталлСубсцриптионХандлерс: истина,
сортСцхема: истина,
игралиште: истина,
отклањање грешака: цонфигСервице.гет<боолеан>("ДЕБУГ"),
отпремања: лажно,
}),
}),
МонгоосеМодуле.форРоотАсинц({
убацити: [ЦонфигСервице],
усеФацтори: асинц (цонфигСервице: ЦонфигСервице) => ({
ури: цонфигСервице.гет('МОНГО_УРИ')
})
}),
],
контролери: [АппЦонтроллер],
провајдери: [АппСервице],
})

извозкласа АппМодуле {}

Овај модул увози ГрапхКЛМодуле из @нестјс/грапхкл анд тхе МонгоосеМодуле из @нестјс/монгоосе што помаже при повезивању са МонгоДБ. Тхе аутоСцхемаФиле својство специфицира локацију генерисане датотеке шеме, и сортСцхема својство осигурава да поља поређају по абецедном реду.

Ево шта је ваш МонгоДБ цонфиг датотека треба да изгледа овако:

увоз {регистровати се као } из'@нестјс/цонфиг';

/**
 * Монго конфигурација везе са базом података
 */
извозУобичајено регистерАс('монгодб', () => {
конст {
МОНГО_УРИ
} = процесс.енв;

повратак {
ури: `${МОНГО_УРИ}`,
};
});

Дефинисање ГрапхКЛ шеме

Након што сте поставили ГрапхКЛ и МонгоДБ везе, требало би да дефинишете ГрапхКЛ упите и мутације да бисте генерисали шему (сцхема.гкл) фајл.

Писање упита

У приступ први код, креирате модел користећи ОбјецтТипе декоратер. Касније ћете овај модел трансформисати у ГрапхКЛ тип.

На пример:

// боок.модел.тс
увоз { Поље, тип објекта } из'@нестјс/грапхкл';
увоз { Проп, Сцхема, СцхемаФацтори } из'@нестјс/монгоосе';
увоз { Документ } из'Мунгос';

извозтип БоокДоцумент = Књига и документ;

@ОбјецтТипе()
@Сцхема()
извозкласа књига {
@Фиелд()
наслов: низ;

@Фиелд()
аутор: низ;

@Фиелд()
Датум објављивања: боолеан;
}

извозконст БоокСцхема = СцхемаФацтори.цреатеФорЦласс (књига);

ГрапхКЛ, подразумевано, не може да користи креиране шеме. Да бисте их учинили функционалним, потребна вам је услуга разрешавања која садржи функције за извршавање ГрапхКЛ типова. То можете учинити са Ресолвер декоратер.

// боокс.ресолвер.тс
увоз { Ресолвер, Куери, Мутатион, Аргс, ИД } из'@нестјс/грапхкл';
увоз {Књига} из'./боок.модел';
увоз { БоокСервице } из'./боокс.сервице';

@Ресолвер(() => књига)
извозкласа БоокРесолвер {
конструктор(приватни боокСервице само за читање: БоокСервице) { }

@Куери(() => [Књига])
асинц књиге(): Обећај {
повратаково.боокСервице.финдАлл();
}

@Куери(() => књига)
асинц књига (@Аргс('ид', { тип: () => Урадио сам: низ): Обећај {
повратаково.боокСервице.финдОне (ид);
}
}

Можете имплементирати БоокСервице, увезено горе, на следећи начин:

// боокс.сервице.тс
увоз { Ињекционо} из'@нестјс/цоммон';
увоз { ИњецтМодел } из'@нестјс/монгоосе';
увоз { Модел } из'Мунгос';
увоз { Књига, БоокДоцумент } из'./боок.модел';

@Ињецтабле()
извозкласа БоокСервице {
конструктор(@ИњецтМодел(име књиге) приватни боокМодел: Модел) { }

асинц финдАлл(): Обећај {
повратаково.боокМодел.финд().екец();
}

асинц финдОне (ид: низ): Обећај {
повратаково.боокМодел.финдБиИд (ид).екец();
}
}

Такође морате да додате БоокРесолвер на листу добављача боокс.модуле.тс.

увоз { Модул } из„@нестјс/цоммон“;
увоз { МонгоосеМодуле} из„@нестјс/мунгоосе“;
увоз { БоокСервице } из'./боокс.сервице';
увоз { БоокРесолвер } из'./боокс.ресолвер';
увоз { Књига, БоокСцхема } из'./боок.модел';

@Модуле({
провајдери: [
БоокСервице,
БоокРесолвер
],
увози: [МонгоосеМодуле.форФеатуре([
{
назив: име књиге,
шема: БоокСцхема,
},
]),
],
})

извозкласа БооксМодуле {}

Рад са мутацијама

Док користите упит за преузимање података у ГрапхКЛ-у, мутације стварају или ажурирају податке у бази података. Да бисте направили мутације, потребно је да прихватите податке од корисника. Тхе ИнпутТипе декоратер, који претвара класу у ГрапхКЛ тип уноса, овде је од користи.

// боок.инпут.тс
увоз { ИнпутТипе, Фиелд } из'@нестјс/грапхкл';

@ИнпутТипе()
извозкласа БоокИнпут {
@Фиелд()
наслов: низ;

@Фиелд()
аутор: низ;

@Фиелд()
Датум објављивања: боолеан
}

Сада можете ажурирати боокс.ресолвер.тс да изгледа овако:

увоз { Ресолвер, Куери, Мутатион, Аргс, ИД } из'@нестјс/грапхкл';
увоз {Књига} из'./боок.модел';
увоз { БоокСервице } из'./боокс.сервице';
увоз { БоокИнпут } из'./боок.инпут';

@Ресолвер(() => књига)
извозкласа БоокРесолвер {
конструктор(приватни боокСервице само за читање: БоокСервице) { }

@Мутација(() => књига)
асинц цреатеБоок(@Аргс('улазни') улаз: БоокИнпут): Обећај {
повратаково.боокСервице.цреате (унос);
}

@Мутација(() => књига)
асинц упдатеБоок(
@Аргс('ид', { тип: () => Урадио сам: низ,
@Аргс('улазни') улаз: БоокИнпут,
): Обећај {
повратаково.боокСервице.упдате (ид, инпут);
}

@Мутација(() => књига)
асинц делетеБоок(@Аргс('ид', { тип: () => Урадио сам: низ): Обећај {
повратаково.боокСервице.делете (ид);
}
}

И боокс.сервице.тс овако:

увоз { Ињекционо} из'@нестјс/цоммон';
увоз { ИњецтМодел } из'@нестјс/монгоосе';
увоз { Модел } из'Мунгос';
увоз { Књига, БоокДоцумент } из'./боок.модел';

@Ињецтабле()
извозкласа БоокСервице {
конструктор(@ИњецтМодел(име књиге) приватни боокМодел: Модел) { }

асинц створити (књига: књига): Обећај {
конст невБоок = Новаово.боокМодел (књига);
повратак невБоок.саве();
}

асинц ажурирање (ид: низ, књига: Књига): Обећај {
повратаково.боокМодел.финдБиИдАндУпдате (ид, књига, { Нова: истина }).екец();
}

асинцизбрисати(ид: низ): Обећај {
повратаково.боокМодел.финдБиИдАндДелете (ид).екец();
}
}

Тхе @Мутација декоратер означава функцију као тип мутације и @Аргс декоратер граби све улазе прослеђене у функцију.

На крају, требало би да увезете БооксМодуле у АппМодуле да буде функционалан. Такође би требало да прођете БооксМодуле до форРоотАсинц као што се види у наставку.

увоз { БооксМодуле } из'./боокс/боокс.модуле';
/**
 * остали увоз
*/

@Модуле({
увози: [
ЦонфигМодуле.форРоот({
лоад: [монгодбЦонфиг],
исГлобал: истина
}),
НестГрапхКЛМодуле.форРоотАсинц({
возач: АполлоДривер,
убацити: [ЦонфигСервице],
усеФацтори: асинц (цонфигСервице: ЦонфигСервице) => ({
аутоСцхемаФиле: придружи се (процесс.цвд(), 'срц/сцхема.гкл'),
инсталлСубсцриптионХандлерс: истина,
сортСцхема: истина,
игралиште: истина,
отклањање грешака: цонфигСервице.гет<боолеан>("ДЕБУГ"),
отпремања: лажно,
}),
}),
МонгоосеМодуле.форРоотАсинц({
убацити: [ЦонфигСервице],
усеФацтори: асинц (цонфигСервице: ЦонфигСервице) => ({
ури: цонфигСервице.гет('МОНГО_УРИ')
})
}),
БооксМодуле,
],
контролери: [АппЦонтроллер],
провајдери: [АппСервице],
})

извозкласа АппМодуле {}

Можете тестирати код тако што ћете покренути нпм рун старт: дев у вашем терминалу, а ваша апликација би требало да почне успешно на порту 3000.

Отвори лоцалхост: 3000/грапхкл у вашем претраживачу да бисте приказали Грапхикл интерфејс где можете тестирати упите и мутације. Ево примера који приказује упит:

А ево примера мутације:

Изградите ефикасне АПИ-је са НестЈС и ГрапхКЛ

Изградња ГрапхКЛ АПИ-ја у НестЈС са МонгоДБ користећи Монгоосе укључује дефинисање шеме за ГрапхКЛ АПИ, шеме за модел Монгоосе, сервис за интеракцију са базом података и резовер за мапирање ГрапхКЛ операција у сервис методе.

НестЈС има уграђену функционалност за прављење АПИ-ја, укључујући декоратере за дефинисање рута, чуваре за њихову заштиту и међуверзије за руковање захтевима и одговорима. Такође подржава друге базе података као што су ПостгреСКЛ, МиСКЛ и СКЛите, као и друге ГрапхКЛ библиотеке као што су Аполло и ТипеГрапхКЛ.