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 czym są trapez, czyli typy wspólne, jak bym to nazwał.
Definiują typ, który może zwrócić więcej niż jeden typ.
Jakby to brzmiało.
Wyobraź sobie, że mamy tutaj jakiś type result.
I ten Richard.
Jest to typ, który będzie zwracał coś np.
w jakimś skurczu czy w jakiejś metodzie
serca i my wtedy na takim typie moglibyśmy zwrócić np.
koment albo.
Autor.
Ponieważ jest to Union type.
Wyobraźmy sobie tą sytuację z serwisem.
Niech to będzie metoda serwera.
W tym miejscu.
To tak naprawdę taką metodę Serge
byśmy chcieli tutaj w niej zwracać nie tylko jeden typ,
ponieważ możemy zwrócić różne wyniki wyszukiwania.
Jeżeli sobie wyobrazić takiego gugla, to
nie zwraca jednego typu, tylko zwraca kilka różnych typów jak np.
reklamy jak na wyniki wyszukiwań itd.
I my również byśmy mogli np.
naszym ogólnym na stronie zwrócić
dwa różne typy i do tego potrzebna byłaby nam Unia.
I właśnie takie unie tworzy się za pomocą union type.
Narysujemy taki mniej więcej przykład jak by to mogło wyglądać.
Powiedzmy, że mamy nasz type POST w aplikacji oraz mamy również type galerii.
Kiedy wyszukujemy coś w postach i w
galeriach to po prostu tworzymy jakiś Type Serge Result, który będzie typem postów i.
Galerii.
I tak jak pokazałem Ci w poprzednim kursie
wygląda to mniej więcej tak, że kiedy wykonujesz metodę search.
To wtedy możesz zwrócić tutaj.
Może utworzymy taki komentarz. OK.
Blokowy będzie nam łatwiej, jeżeli wykonujemy metodę search.
I tutaj możesz zwrócić albo wyklarować po różnych typach.
Czyli jeżeli np.
wyszukujemy na stronie np.
z filtrem postów, to wtedy możemy ten nasz
query przygotować w taki sposób, że powiemy on post.
Wybierz pola, które są tylko i wyłącznie dla post w tym miejscu.
A jeżeli byśmy chcieli kolorować na polach
dla galerii, być musieli uwagę na typie galerii.
Wybierz pola dla dla galerii.
Czyli generalnie nie możemy tutaj generować w tym miejscu dla pole na polu
dla postu, ponieważ tak naprawdę typ result nie wie jakie tu będzie pole.
Jest to po prostu unia jednych z tych
typów, więc musimy powiedzieć, że AJ tutaj ładujemy na Type POST.
Więc tak wygląda przykład CRM.
Ja tutaj przygotowałem troszeczkę inny przykład.
W bazie danych jeżeli zerkniesz.
To mamy.
Czyli mamy dwie tablice i generalnie tutaj te pola się zgadzają.
Natomiast możesz zauważyć, że na tablicy
mamy every clouds, a na tablicy man mamy fabrykę cars.
Czyli generalnie jeżeli byśmy kierowali na nie możemy wyklarować faworyt Cars, ale
możemy wyklarować Clouds, więc możemy to teraz zaimplementować.
Pokażę Ci jak to wygląda.
Natomiast przejdźmy może tutaj do Apollo.
W Apollo są fajne definicje odnośnie interfejsy.
My zajmujemy się teraz Union.
Interfejsy wyglądają bardzo podobnie, więc
gdybyś chciał o tym doczytać to oczywiście do tego Cię zachęcam.
Natomiast tutaj jest właśnie fajne ten
przykład odnośnie SS czy jak to wygląda, czyli tutaj np.
kiedy ktoś z queer uje na sercu to na polu autor np.
jest pole name, ale na polu jest pole typ,
więc musimy tutaj na odpowiednich polach query.
Czyli to jest dokładnie to o czym mówiłem.
Natomiast tutaj troszeczkę niżej mamy
informacje jak takie unie rezerwować, czyli jak tworzyć do nich recovery.
Więc kiedy stworzymy taki recover dla typu
result to musimy tutaj wykonać wewnętrzną metodę naszego nowego serwera record type
i musimy sprawdzić jaki object name tutaj mamy zwróconej i na tej podstawie
powiedzieć, że będziemy tutaj zwracać ten typ.
Wtedy Graph Query
przejdzie do tego typu author i na tym typie autor będzie kierował odpowiednie
pola, a więc możemy sobie ten kod w zasadzie skopiować.
Przejdźmy do kodu, aby stworzyć nasze dla
i na razie napiszmy może Scheme, czyli stwórzmy Type.
Person.
I ten typ person będzie w zasadzie unią typu.
Women lub MEN.
OK.
I tutaj stwórzmy sobie te typy.
PP oraz main.
I będziemy potrzebować dokładnie tych pól, które mamy w bazie danych, czyli możemy.
Je.
W sumie jest to ID 4 last name, więc po prostu je tutaj przypiszemy.
ID typu id.
Page typu.
Integer.
Name.
Trening.
Last string.
No i na te moment mamy właśnie to pole Every Clouds.
Czyli unikatowe dla tego pola i będzie to tablica stringów.
OK.
I w zasadzie będziemy mieć bardzo podobny typ dla mnie.
Natomiast tutaj unikatowym polem będzie Fever Cards.
Będzie ona tego samego typu, natomiast nie ma to znaczenia.
Naszą unią email jest person, więc teraz kiedy byśmy tutaj stworzyli metodę.
Get person.
I zwrócili te person.
To będziemy musieli teraz stworzyć taki resolve.
Więc możemy tutaj.
Oczywiście mamy.
Teraz problem.
Zobaczmy, co jest nie tak.
An expected.
Równa się A.
Definiując Unię musimy po prostu explicite
napisać, że jest to Unia, czyli musimy stworzyć i unia personalna i to się równa.
I teraz nasza a powinna być już poprawna.
OK, i teraz mamy informację brakuje dla tego person definicji rezerw tablicowej,
więc musimy po prostu taki rewolwer stworzyć.
Możemy teraz stworzyć tutaj nowy projekt i będzie to Person solver.
Eksportujemy konstrukt.
Person rewolwer.
OK i tutaj będziemy mieć metodę get person
i tą metodę będziemy implementować tak jak tutaj mamy np.
dokumentację Apollo.
Czyli przejdźmy.
Do tego.
Elementu, czyli mamy get person.
Mamy tutaj price.
Result.
Dobra.
Get person zwróci.
Nam.
Result, więc będziemy tutaj również musieli sobie zrobić jeszcze jeden.
Eksport const.
I tutaj będzie person.
Czyli w zasadzie to wygląda tak jak w przypadku np.
Bucks, żebyś sobie przypomniał rewolwer.
Mamy tutaj Bugs, natomiast mamy tutaj również pola, a więc na tym polu,
a tym typie person będziemy musieli również tutaj jakieś
coś stworzyć i to będzie właśnie ten resolve type, który będziemy tworzyć.
Natomiast Person będzie musiało nam
segregować jakieś dane z bazy danych, czyli normalnie przechodzimy parent rx.
Areas db.
I tutaj będziemy w zasadzie zwracać.
Zarówno.
W taki. Sposób zarówno DBI.
I teraz w bazie danych definicja, wolumen oraz definicja, czyli DB.
Czyli jeżeli bierzemy jakiegoś człowieka,
to bierzemy zarówno z tego koszyka oraz menu.
Natomiast kiedy kupujemy pola, to musimy zarezerwować typ.
I my tutaj będziemy mieć dwa typy.
Jeden to będzie właśnie tutaj.
Zdefiniowaliśmy menu oraz menu.
OK i. Tutaj.
Będzie nieobecny.
Natomiast tu będzie dla MEN.
Będzie faworyt cars.
Czyli jeżeli ktoś kupuje na faworyt Cars,
albo jeżeli ktoś gwarantuje na faworyt Clouds.
To musimy zwrócić odpowiedni typ. Czyli tutaj.
Będziemy. A tutaj będzie.
W przeciwnym razie zwracamy tutaj nulla.
Czyli tak to generalnie działa.
OK, więc możemy to zapisać.
Musimy teraz jeszcze te dwa resolve sobie podpiąć.
Więc wejdźmy do indeksu.
Stwórzmy import.
Ród Person Resolve oraz Person.
I tutaj będziemy to Soros resolve.
Oraz to będzie person solver.
Dodajemy je tutaj, czyli nasze query.
Oraz tutaj musimy dodać person.
Dobra,
teraz już pozbyliśmy się tego elementu, że na typie person brakuje nam Real z tej
pory serwera i nasz serwer się odświeżył, więc przejdźmy do gruntu.
Zobaczmy jak to wygląda w dokumentacji.
Mamy teraz tutaj Get Person.
Jest to typ person, który jest unią dwóch typów.
Jest to zarówno human jak i.
Jeżeli wejdziemy w moment to mamy
dokładnie właśnie tutaj nasz Every Cloud, jeżeli wejdziemy w fazę warstw.
Więc teraz napiszmy query.
Więc teraz zróbmy sobie GET.
Sam.
I teraz powiedzmy, że na etapie.
Chce pobrać Freddiego Whitney.
OK, mamy jakiś problem.
Więc zobaczmy co jest nie tak.
OK, natomiast już widzę co jest nie tak.
Również to zauważyłeś.
Tutaj po prostu próbuje zwrócić obiekt, a
to musi być oczywiście tablica, ponieważ działamy na tablicach, czyli to jest
zarówno tablica jak i to jest tablica, więc to jest tutaj musimy zwrócić tablicę
i zarówno musimy wskazać, że tutaj to nie będzie person, tylko to będzie tablica,
ponieważ tak naprawdę dobieramy się do tablic, a nie do obiektu.
Dobra. I teraz to powinno działać.
Pewnie też już zauważyłeś wcześniej ten błąd.
Więc teraz spróbujmy.
To wyklarować i tutaj.
No i mamy tutaj pusty obiekt, ponieważ na moment nic nie kierujemy.
Natomiast gdybyśmy zrobili.
To możemy również tutaj wyklarować np.
wagę.
I wtedy mamy tutaj również ten obiekt wypełniony.
I teraz co jest ciekawe, to właśnie te dwa unikatowe pola, czyli faworyt Cars.
Jeżeli teraz tutaj wypatrujemy to, to dostaniemy właśnie faworyt KRS.
Natomiast gdybyśmy chcieli wyklarować
KRS, to nie możemy tego zrobić, ponieważ na tym typie takie.
Pole nie istnieje.
Natomiast istnieje faworyt kod i wtedy możemy.
Dostać to pole dla tego typu numeru.
Czyli jeżeli przyjrzymy się jeszcze raz temu, co tutaj się dzieje w Resolve,
to tak naprawdę używamy wewnętrznej metody record type i kiedy kierujemy na jakimś
konkretnym polu, to możemy powiedzieć celowi, że AI.
Tutaj musisz zwrócić ten typ i kserować dane na tym typie.
Czyli musisz zaglądać do scheme na typie
Women i kierować dane na typie Women, ponieważ ktoś pyta.
O.
Dane z Fever Clouds, które istnieją tylko na tym typie na przykład.
Mam nadzieję, że Union Tape są dla Ciebie zrozumiałe.
A ja już teraz zapraszam Cię do kolejnej lekcji, gdzie pokażę Ci jak skonfigurować
gra SQL Server, aby wypuścić go na produkcję.