Projektowanie Serwera
2 godz. 7 min · Full-stack i Programowanie
Przemysław NowakSoftware EngineerJeżeli kiedykolwiek używałeś GraphQL aby pobrać dane na Front-endzie to z pewnością wiesz, że aby to zrobić musisz znać połączenie Grafów oraz wiedzieć jak stworzyć odpowiednie zapytanie. W kursie tym nauczysz się jak takie grafy projektować od strony serwera i dostarczać je dla FrontEnd Developerów.
Dowiesz się jakie jest połączenie pomiędzy schematem serwera a resolverami. Schemat (schema) to nic innego jak opis aplikacji GraphQL z podziałem na typy i relacje - właśnie w taki sposób tworzą się grafy - natomiast resolvery są odpowiednikami w kodzie - wykonującymi się za każdym razem kiedy ktoś wysyła odpowiednie zapytanie. Dokładnie wytłumaczę Ci korelację pomiędzy tymi dwiema rzeczami oraz na konkretnych przykładach zrozumiesz jak je implementować.
Statystyki są nieubłagane - coraz więcej firm inwestuje w GraphQL ze względu na rewolucyjne podejście do pobierania danych oraz jego prostotę. Dlatego jeżeli spojrzymy na rynek pracy to możemy zobaczyć, że GraphQL staję się pewnego rodzaju "must have", którego z pewnością warto się nauczyć.
Przekonasz się, że tworzenie backendu z GraphQL jest niesamowicie szybkie. Kiedy zrozumiesz podstawowe połączenia schematu i resolverów nic Cie nie powstrzyma od błyskawicznego pisania kodu. Jeżeli chcesz stworzyć MVP, czy zaimplementować elastyczny mikro serwis to GraphQL może okazać się strzałem w dziesiątke dlatego, że możesz stworzyć aplikację z prędkością światła, a co więcej, każda rozbudowa jest bardzo prosta ze względu na brak zależności w kodzie.
Tego wszystkiego nauczysz się w tym kursie, odczyt i zapis danych wydają się rzeczą normalną, natomiast dla mnie najciekawszą rzeczą są subskrypcje dzięki, którym możesz tworzyć aplikacje działające w czasie rzeczywistym. Zobaczysz, że z GraphQL wcale to nie jest skomplikowane, a wręcz banalnie proste!
Kurs ten jest skierowany do osób, które mają podstawową wiedzę nt. GraphQLa oraz znają podstawy JavaScript - ponieważ za pomocą NodeJS zaimplementujemy serwer GraphQL. Jeśli jeszcze tego nie zrobiłeś/aś - polecamy przed przystąpieniem do tego kursu przerobienie materiałów JavaScript od Podstaw, kursu podstawowego GraphQL, a mile widziana jest także znajomość zagadnień z kursów Node.js.
W tej lekcji pokażę Ci jak
zaimplementować bazę danych, czyli jak używać kontekstu Graph Kulawego
oraz zaczniemy tworzyć naszą aplikację książek.
Dodamy Revolver Book i będziemy pobierać
książki z bazy danych, więc jesteśmy tam, gdzie skończyliśmy.
W kodzie tworzymy nowy plik, nazwijmy go.
Dobrze jest.
Ja tutaj mam już przygotowaną całą bazę danych.
Jest tutaj baza danych z książkami, z autorami, z komentarzami do tych książek.
Czyli w zasadzie jeżeli oglądaliście pierwszą część kursu, to pewnie wygląda to
znajomo, ponieważ to jest dokładnie ta sama baza i również jeżeli chciałbyś
skopiować sobie tą bazę to możesz to zrobić.
Jest tutaj do playera dołączony również cały ten Jackson.
Możesz to po prostu zrobić i skopiować do pliku DVD.
Jest tak jak ja to zrobiłem.
No więc mamy bazę i teraz chciałbym Ci
pokazać jak z takiej bazy danych korzystać.
W zasadzie będziemy tutaj musieli dodać sobie kolejną opcję Graph Query Server.
I w tej instancji.
Mamy tutaj na razie definicje typów czyli Scheme, mamy recovery
i teraz będziemy chcieli dodać jeszcze jedną rzecz, czyli kontekst.
I jeśli chodzi o kontekst jest to trzeci
argument, który zawsze dostajemy w naszych serwerach, czyli kontekst.
Tak naprawdę dostajemy w tym miejscu
i to jest dokładnie to, co tutaj zdefiniowaliśmy.
Czyli jeżeli ja teraz zdefiniowałem pusty obiekt, to również tutaj możesz sobie
wyobrazić, że ten kontekst to jest ten pusty obiekt i to, co jest ważne, to w
przypadku baz danych akurat my, kiedy działamy na pliku i te dane będą tylko w
pamięci, nie ma to takiego dużego znaczenia.
Natomiast tak naprawdę chciałbyś zapewne robić tylko jeden kontekst do bazy danych,
więc jeżeli byś tutaj na przykład tworzył bazę danych i łączył się np.
z MySQL em, czego ja nie będę tutaj robił,
to byś chciał mieć tylko jedną instancję tego SQL a i tego kontekstu dodaje SQL a
i we wszystkich rezultatach właśnie z tej instancji korzystać.
Dlatego kontekst jest idealnym miejscem dla takich rzeczy.
My tutaj po prostu dodamy sobie plik
z naszej bazy danych ze importujemy go do zmiennej DB, a więc do samej góry.
Stwórzmy import db from db.
I tutaj właśnie to przekażemy, czyli po prostu przekazujemy ten DB w tym miejscu
teraz każdej z tych metod, byśmy mogli tutaj użyć kontekstu
albo nawet go zrestrukturyzować, tak jak w przypadku argumentów.
I byśmy mieli tutaj dostępną bazę danych,
więc będziemy mieć dostęp do tego miejsca i będziemy mogli wybierać z niego dane.
Ja to na razie wszystko wyczyszczę,
więc wyczyść całe query, a w zasadzie query może zostawmy, ale
wyczyść te dwie metody, które mamy w środku, bo nie będziemy ich używać.
Ten wielki message również możemy wyczyścić i tutaj również wyczyścić
ten wielki message i stworzymy tutaj scheme dla naszych książek.
Czyli stwórzmy blok i.
Tworząc Scheme często opieramy się o bazę danych, więc możemy tutaj zobaczyć
jak tak naprawdę kształt tego obiektu w bazie danych wygląda.
Tutaj mamy ID oraz mamy pole autorski, które jest tablicą.
Idee autorów to jak rozwiązywać i pobierać.
Takich autorów pokażę Ci w kolejnych lekcjach.
Na razie po prostu dodamy bardzo prosty ID i tytuł.
A więc stwórzmy Bóg, który będzie pewnie
przyjmował, a w zasadzie służby BUX może, żeby pobierać wszystkie książki Get Books
nie będzie przyjmował żadnych argumentów, natomiast będzie zwracał tablicę książek.
I chcę, żeby tutaj zawsze była książka, czyli pole label.
Nie może być takiej sytuacji, że będę miał np.
tablicę.
Książka null.
Nie chcę takie sytuacje, więc oznaczam
pole jako label i również cała tablica jest uległą.
Czyli jeżeli nie ma żadnych książek w
bazie danych, to przynajmniej chcę dostać pustą tablicę.
Teraz stwórzmy typ book.
Tutaj stworzymy pole ID i to będzie typ ID.
Również pole label oraz pole typu to będzie string i również pole label.
Więc nasza jest gotowa.
Mamy teraz jakiś problem dlatego, że nie znajduje nam dBi.
OK, ale tutaj literówkę.
Zapiszmy.
No dobra, jest gotowa, ale
to tak naprawdę nie zadziała, bo jak widzisz całe nasze query jest puste, więc
musimy stworzyć również tutaj implementację tej metody.
Natomiast może ja bym chciał już posprzątać trochę w tym kodzie.
Więc stwórzmy tutaj katalog
i nazwijmy go Soros, byśmy pisali ten kod również z dobrymi
praktykami i stwórzmy tutaj w może katalog któryś wers.
I w tym katalogu real wersji.
Ja bym chciał stworzyć plik book czyli awers i rewers.
Czyli będziemy mieć podział w katalogach narysowany dla różnych grafów.
Stworzyłem plik.
S.
Zmieńmy jego nazwę na GS.
Dobra i teraz po prostu stworzymy sobie eksport.
Bo root book czyli serwer.
I to w zasadzie nie ma znaczenia jak nazwiemy tą metodę.
Tak naprawdę będziemy ją i tak dodawać do naszego pliku.
Query czyli w tym miejscu.
Czyli po prostu zamiast po prostu stworzyć get books to ja tą
metodę stworzę w pliku book resolve i wtedy ten cały obiekt, który od stąd
eksportujemy w tym miejscu, ze spróbujemy w taki sposób.
Możemy również od razu sobie to zrobić i
będziemy mogli działać już na pliku book resolve.
A więc za importujemy Book Book Recorder.
I to będzie Source server Bóg.
Dobra.
Powinno to działać.
Czyli.
Znowu błąd w słowie import, to teraz pojęcie zaimportować jest ok.
I teraz tutaj zgodnie z tym co mamy w
Skyrimie czyli Get books wraca book, będziemy tworzyć target books parents.
Nie dostajemy argumentów, nie dostajemy,
więc po prostu zostawiamy puste te dwa pola.
Jasne, że to są argumenty, natomiast będziemy chcieli używać bazy
danych, czyli kontekstu, czyli tak jak mówiłem, trzecim argumentem jest kontekst
i my tutaj będziemy mogli to sprzedawać i użyć bazy danych, czyli DB.
I Get books będzie nam zwracało funkcje.
I tutaj powiemy, że DB Box po prostu.
Czyli zrobimy takiego return, czyli dokładnie to, co mamy w bazie danych.
Mamy tutaj tablicę books i w ten sposób ją właśnie zwrócimy.
Dobra, teraz przejdźmy do Play.
Możemy wyczyścić to stare query albo stworzyć po prostu nową zakładkę.
Tworzymy box box.
Bez żadnych argumentów, natomiast musimy wyklarować sobie pola.
Jednym polem będzie tytuł, a drugim polem będzie ID.
Oczywiście to zależy od nas jakie pola będziemy kierować.
I teraz jeżeli wykonałem to query to tak
jak widzisz mamy tutaj ID typu tych książek, które mamy w bazie danych,
czyli dokładnie tego co tutaj mamy przedstawione.
Nie mamy jeszcze autorów, dlatego, że autorzy tak naprawdę teraz to są tylko ID.
Możemy to pole dodać jako tablicę stringów w dokumentacji.
To pole również nie istnieje, ponieważ nie zdefiniowaliśmy jego w Scheme.
Natomiast w kolejnej lekcji pokażę Ci jak pobierać te relacyjne dane,
czyli jak pobierać dane od razu autorów z innego typu.
Tak więc tworzymy sobie typ autor
i na tej podstawie będziemy pobierać autorów z bazy danych, którą właśnie teraz
tutaj stworzyliśmy i będziemy łączyć te dane relacyjne.
Dziękuję za uwagę w tej lekcji i zapraszam Cię do kolejnych.
db.js · 1 min
export default {
// BOOKS
books: [
{
id: 'b32b9538-9af9-43c4-ba77-cbfe7041569a',
title: 'Amazing Book #1',
authors: ['dff1909c7-d6ce-449e-b35f-41c058463075', '78e92bc5-0518-4857-93da-196b0230ee9b']
},
{
id: 'd2854f64-80a2-45b4-94b8-3897da845f7b',
title: 'Amazing Book #2',
authors: ['4df0f1c4-befd-467a-af05-60b5f94b2341'],
},
{
id: '9ed38533-b884-4eb2-a68b-e4f1ef885760',
title: 'Amazing Book #3',
authors: ['2e426c72-fcfa-4737-850f-9aee8cb284ea']
},
{
id: '98d051df-95ba-4ec5-aab5-19af4796cee8',
title: 'Amazing Book #4',
authors: ['d0f001ec-a71c-4631-aa2d-500e3325c718', 'ff4547fb-b43d-4f61-b7a5-733d00b44825']
}
],
// AUTHORS
authors: [
{
id: 'd0f001ec-a71c-4631-aa2d-500e3325c718',
firstName: 'Joe',
lastName: 'Doe'
},
{
id: '78e92bc5-0518-4857-93da-196b0230ee9b',
firstName: 'Calvin',
lastName: 'Klein'
},
{
id: '2e426c72-fcfa-4737-850f-9aee8cb284ea',
firstName: 'Brian',
lastName: 'Tracy'
},
{
id: '4df0f1c4-befd-467a-af05-60b5f94b2341',
firstName: 'Daniel',
lastName: 'Goleman'
},
{
id: 'dff1909c7-d6ce-449e-b35f-41c058463075',
firstName: 'Hans',
lastName: 'Rosling'
},
{
id: 'ff4547fb-b43d-4f61-b7a5-733d00b44825',
firstName: 'Emily',
lastName: 'Bronte'
}
],
// COMMENTS
comments: [
{
id: 'e5062cca-4d31-459c-8a47-24d6ee32475a',
bookId: 'b32b9538-9af9-43c4-ba77-cbfe7041569a',
content: 'Approved Comment is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an uive centuries, but also the leap into electronic typesetting.',
approved: true
},
{
id: 'e5062cca-4d31-459c-8a47-24d6ee32475b',
bookId: '9ed38533-b884-4eb2-a68b-e4f1ef885760',
content: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry\'s standard dummy text ever since the 1500s, when an uive centuries, but also the leap into electronic typesetting.',
approved: false
}
],
// Example only for inline fragments puproses
// PEOPLE
women: [
{
id: 'e50s2cca-4d31-459c-8a47-24d622312475a',
age: 30,
firstName: 'Hillary',
lastName: 'Clinton',
favoriteClothes: ['Dress', 'T-Shirt']
}
],
men: [
{
id: 'e50s2bba-4d31-459c-8a47-24d622312476a',
age: 55,
firstName: 'Brad',
lastName: 'Pitt',
favoriteCars: ['Porsche', 'Mercedes', 'BMW']
}
]
};