Najważniejsze zagadnienia, które musisz znać
5 godz. 53 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykPrzesyłanie oraz transformacja danych to jeden z najważniejszych elementów działania każdej aplikacji. Dobre zrozumienie tego w jaki sposób odbywa się ten proces, daje równocześnie lepsze zrozumienie całej struktury oraz podejmowania decyzji projektowych. W tym kursie znajdziesz lekcje, które pozwolą Ci uporządkować wiedzę na temat protokołu HTTP oraz formatów wymiany danych.
REST oraz GraphQL to nadal nieodłączone zagadnienia tematu wymiany informacji w kontekście aplikacji webowych. Pomimo tego, że ich koncepcje zwykle są bardzo dobrze opisane w różnych źródłach, tak ich wykorzystanie "na produkcji" potrafi sprawić problemy. W szczególności gdy weźmiemy pod uwagę, wyjątki oraz fakt, że nie każda aplikacja będzie wymagać implementacji REST czy GraphQL w 100%. W tym kursie znajdziesz wiele praktycznych wskazówek związanych z pracą z REST API oraz wprowadzenie do pracy z GraphQL.
Niektóre błędy w aplikacji są bardzo pożądane, w szczególności gdy jasno informują użytkownika o tym, co się wydarzyło oraz o tym, co może z tym zrobić. Pomimo tego, że w wielu przypadkach opracowanie komunikatów leży w rękach osoby odpowiedzialnej za copywriting (i/lub ux writing), tak sama implementacja tych komunikatów odbywa się po stronie kodu. Nie rzadko okazuje się, że poprawna i skuteczna walidacja danych oraz obsługa błędów nie jest oczywista w "produkcyjnych" sytuacjach. W tym kursie znajdziesz najczęściej spotykane problemy oraz sposoby ich rozwiązania.
Bazy danych są praktycznie nieodłączną częścią każdej aplikacji. W roli full-stacka prędzej czy później przyjdzie Ci z nimi pracować a nie rzadko nawet projektować oraz rozbudowywać ich struktury. W tym kursie znajdziesz informacje o bazach danych, które pozwolą Ci je zrozumieć oraz od razu poznać użyteczne techniki, które pomogą Ci w pracy z nimi, zarówno na produkcji jak i w środowisku lokalnym czy testowym.
Nie wszystkie informacje w aplikacji są publiczne. Niektóre wprost nie mogą takie być. Z tego powodu niezbędne są sposoby na to aby poznać a potem weryfikować tożsamość użytkownika, by na jej podstawie przydzielać mu dostęp wyłącznie do zasobów, do których odczytywania posiada uprawnienia. Istnieje wiele technik, które umożliwiają zarządzanie dostępem do danych i w tym kursie poznasz najważniejsze z nich. Dowiesz się nie tylko w jaki sposób zabezpieczać dane ale poznasz też najpopularniejsze sposoby na to aby te zabezpieczenia łamać i obchodzić. Mając świadomość takiej możliwości, będziesz w stanie lepiej podejmować decyzje o tym jak projektować dostęp do informacji.
Istnieją problemy charakterystyczne dla niemal każdej aplikacji. W związku z ich powszechnością, istnieje też szereg rozwiązań lub sposobów na to, aby możliwie zredukować ich następstwa. Na przestrzeni lekcji tego kursu zobaczysz wiele przykładów, które pomogą Ci w codziennej pracy a niekiedy nawet, pozwolą uniknąć błędów, których konsekwencje nie zawsze występują natychmiast.
Kurs powstał z myślą o osobach, które chcą rozwijać się w roli full-stack web developera / developerki, przeprowadzając przez najważniejsze zagadnienia z obszaru wymiany, transformacji oraz przechowywania informacji w aplikacji oraz pomiędzy aplikacjami. Jeżeli potrzebujesz zobaczyć szeroką perspektywę tego, w jaki sposób dane przepływają pomiędzy różnymi częściami aplikacji, lub ugruntować swoją wiedzę na ten temat, to ten kurs jest miejscem, którego szukasz.
W tej lekcji przyjrzymy się bliżej błędom typu kod.
Prawdopodobnie zdarzyło Ci się już z nimi
spotykać lub z całą pewnością będzie spotykać się z nimi w przyszłości.
Początkowo, jeżeli nie masz wystarczającej wiedzy na temat tego, dlaczego występują i
na czym polegają, mogą sprawić Ci dużo problemów.
Dlatego teraz przyjrzymy się tym przynajmniej najczęściej występującym
przypadkom i tym, jak możesz sobie z nimi radzić.
Zacznijmy od tego, że kod to nic innego
jak pewnego rodzaju polityka uwzględniająca zestaw zasad dotyczący
wymiany informacji pomiędzy różnymi domenami.
Czyli przykładowo jeżeli mamy dwie aplikacje działające w dwóch różnych
domenach, to domyślnie nie mogą one komunikować się ze sobą, o ile po stronie
serwera nie skonfigurujemy odpowiednich ustawień i też ewentualnie po stronie
klienta nie będziemy respektować ustawień serwera.
Zatem chodzi tutaj o nic innego jak o bezpieczeństwo przesyłania informacji
pomiędzy różnymi serwerami albo naszą aplikacją.
Nietrudno tutaj się domyślić, że w
momencie, gdy mamy różne aplikacje i różne źródła, no to wiadomo, że fajnie byłoby
ograniczyć możliwość komunikacji ich ze sobą.
Ale jeżeli mamy dwie aplikacje, które należą do nas, np.
część działającą po stronie klienta, a drugą po stronie serwera, to jak
najbardziej chcielibyśmy umożliwić tą komunikację.
Rzecz w tym, że wiele tutoriali wskazuje
rozwiązanie problemu jako odblokowanie połączeń całkowicie.
Jest to jak najbardziej zła praktyka i nie należy się jej stosować ze względu na to,
że w ten sposób narażamy naszą aplikację na ataki z zewnątrz.
Tutaj na Eden mamy pełną listę błędów związanych z KOD.
Teoretycznie moglibyśmy teraz przejść
przez całą tę listę, natomiast teraz skupimy się wyłącznie na praktyce i tym,
co faktycznie może spotkać w codziennej pracy.
Z całą pewnością to, co będzie wymagało naszej uwagi to obsługa funkcji fetch,
którą prawdopodobnie już teraz na każdym kroku wykorzystujesz.
Oczywiście jeżeli korzystasz chociażby z
Excela bądź innej biblioteki do wykonywania zapytań HTTP, to oczywiście
większość z tych ustawień również tam znajdziesz.
Jak oczywiście wiesz, w momencie gdy wysyłamy zapytanie musimy ustawić np.
metodę zapytania oraz nagłówki.
Rzecz w tym, że ustawienia kodów mogą limituje przede wszystkim to, jakie metody
możemy uwzględniać w komunikacji z naszym serwerem.
I to samo tyczy się nagłówków.
Z tego powodu w momencie, gdy komunikujesz się z inną domeną niż ta, na której działa
aktualnie Twoja aplikacja, musisz przede wszystkim aktywować kod.
W przeciwnym razie od razu Twoje połączenie zostanie odrzucone.
Następnie, w momencie, gdy do komunikacji dochodzi właśnie pomiędzy różnymi
domenami, a Ty chcesz przesłać nagłówki autoryzacji bądź ciasteczka i chcesz np.
w przypadku http only i kuki ustawia się
automatycznie, tą właściwość kredensu musisz ustawić na include.
Ewentualnie gdy komunikujesz się w ramach
jednej domeny ustawiasz ją na sam origin, przy czym jest to domyślna wartość.
No i teraz tak właściwie to co właśnie
powiedziałem to są najważniejsze informacje w kontekście metody POST.
Przejdźmy więc teraz do praktycznego przykładu.
Przygotowałem tutaj dwie aplikacje.
Pierwsza z nich działa po stronie klienta i próbuje wysłać dwa zapytania jedno typu
POST, drugie typu GET, a następnie odczytać odpowiedź.
Następnie mamy tutaj aplikację działającą po stronie serwera.
Pierwszy endpoint ustawia ciastko
zawierające access token i to ciastko jest typu HTTP only.
Oznacza to, że w momencie gdy wykonamy
zapytanie na ten endpoint, do naszego klienta powinno trafić ciasteczko.
Następnie mamy tutaj drugi endpoint, który
próbuje odczytać ciastka przesłane razem z zapytaniem.
Inaczej mówiąc w tym pierwszym endpoint
ustawiamy ciasteczko, a w drugim próbujemy je odczytać.
Jeżeli teraz uruchomimy naszą aplikację, a
następnie przejdziemy do konsoli, to okaże się, że oczywiście mamy tutaj błąd
połączenia wynikający właśnie z polityki KOD.
Próbujemy tutaj nawiązać połączenie pomiędzy domeną localhost działającą na
porcie 3000 z domeną 127.0.0.1 działającą na porcie 5000 173.
Coś takiego oczywiście nie działa.
I w tym momencie mamy tutaj informację o
tym, że moglibyśmy tutaj ustawić tryb na kod.
Natomiast w naszym przypadku zupełnie nas to nie urządza ze względu na to, że wtedy
nie będziemy w stanie odczytać faktycznej zawartości odpowiedzi.
W związku z tym to co musimy zrobić, to
dostać się do naszego serwera i odpowiednio skonfigurować kilka rzeczy.
W moim przypadku od razu ustawię sobie tutaj Helmet ze względu na to, że jest to
dobra praktyka i w Twoim przypadku również warto o to zadbać.
Następnie musimy tutaj przekazać obiekt konfiguracyjny do metody tworzącej naszą
aplikację, a konkretnie będzie nas interesowała właściwość Codes, gdzie
normalnie w tutorialach jako origin wskazywana jest tutaj gwiazdka.
Rzecz w tym, że w naszym przypadku ta gwiazdka nie będzie nas interesować, tylko
będziemy chcieli wskazać konkretną domenę, której chcemy umożliwić połączenia.
Poza tym chcemy przekazywać również kredyty szare, czyli chcemy, aby zarówno
nagłówki jak i ciasteczka wędrowały pomiędzy.
Zapytaniami i w tym przypadku uwzględniamy
również wszystkie metody HTTP, z których chcemy przyjmować zapytania.
Poza tym, jak widzisz, mamy tutaj jeszcze
możliwość kontrolowania nagłówków, które może przesyłać do nas klient oraz
nagłówków, które wystawiamy po stronie naszego serwera.
W tym przypadku nas to nie będzie interesowało, natomiast warto zadbać o to,
aby kontrolować to, jakie nagłówki mogą być do nas przesyłane.
W każdym razie, jeżeli teraz wrócimy do
naszego klienta i ponownie wyślemy zapytanie, wszystko tutaj działa.
Oznacza to mniej więcej tyle, że na etapie pierwszego zapytania.
Jeżeli teraz przejdziemy do niego,
powinniśmy mieć ustawione ciastko http only.
Rzeczywiście mamy tutaj taki nagłówek.
Ciasteczko zostało ustawione po stronie
naszej przeglądarki, a więc w momencie, gdy wykonujemy drugie zapytanie.
Teoretycznie to ciastko również powinno trafić do serwera.
Jeżeli jednak podajemy zawartość konsoli
loga, które mamy dokładnie tutaj, to okazuje się, że mamy tutaj NULL.
Wynika to z faktu, że po stronie metody
fetch musimy tutaj uwzględnić właściwość kredensu ustawioną na include.
Analogicznie w przypadku drugim.
I tak naprawdę w tym momencie, gdy wyślemy ponownie zapytanie do naszego serwera,
okazuje się, że nasze szare zostały przekazane i ciasteczko jest dostępne.
Oznacza to mniej więcej tyle, że jeżeli będziesz mieć aplikację, w przypadku
wyślesz zapytanie o Access token, no to ustawiając właściwość
Include będziesz w stanie automatycznie dodawać ewentualne do kolejnych zapytań.
Tym samym Twoim jedynym zmartwieniem
będzie ewentualnie to, że taki access token może przestać być aktualny i będzie
potrzeba wykorzystania albo refresh tokena, albo przekierowania użytkownika do
strony logowania, aby ponownie autoryzował swoje połączenie.
Dodatkowo pamiętaj też o tym, że w momencie gdy serwer ogranicza to jakie
nagłówki możesz przesłać, to oczywiście w momencie, gdy będziesz jednak próbować je
przesłać, okaże się, że ponownie zderzamy się tutaj z błędem
informujący nas o tym, że sorry, ale ten nagłówek nie jest tutaj mile widziany.
W związku z tym w takiej sytuacji albo
rezygnujemy z wysyłania nagłówka lub też ewentualnie dodajemy go do naszej listy.
Jeżeli tak zrobię, dodam go do swojej
listy, a następnie uwzględnię w naszym zapytaniu.
Jak widzisz, wszystko jest tutaj w porządku.
Zatem jeżeli chodzi o błędy typu kod,
najważniejsze jest to, aby było dla Ciebie jasne, że występują one zawsze wtedy, gdy
dochodzi do połączenia pomiędzy różnymi domenami.
Co więcej, te domeny mogą również należeć
do Ciebie, ale tak naprawdę nie ma to większego znaczenia.
Dobra wiadomość jest taka, że po prostu masz kontrolę nad jedną i drugą aplikacją
i możesz poustawiać sobie tak, jak będzie to Ci potrzebne.
Jednocześnie nie stosuj proszę porad,
które można spotkać w tutorialach dotyczące tego, aby stosować tutaj np.
Fiskars. Sytuacja teoretycznie jest taka, że
rozwiązuje Ci to problem błędów typu kors, natomiast jednocześnie np.
podczas audytu w security coś takiego zostanie wskazane jako krytyczny błąd.
Co ciekawe jednak, w naszej konkretnej
sytuacji, w momencie gdy chcemy przesyłać sobie szale, to jak widzisz mamy tutaj
problem polegający na tym, że access control allow origin nie może być
ustawiony jako otwarty w momencie, gdy chcemy to robić.
Dlatego jeżeli chcemy korzystać z takiego
ustawienia, nie możemy korzystać z właściwości Health.
W momencie gdy ja usunąłem błąd, kod zniknął i tym samym też jest to ostatni
przykład najczęściej spotykanego błędu dotyczącego właśnie kod.
Ostatnią rzeczą, na którą chciałbym
zwrócić Twoją uwagę jest to, że w niektórych sytuacjach faktycznie Wizard
może okazać się wręcz konieczny do ustawienia.
Mowa tutaj o sytuacjach, w której wprost chcesz, aby z Twoim np.
API komunikowały się dowolne domeny.
Poza tym jeżeli zajrzymy do typów, to okazuje się, że możemy tutaj
przekazać zarówno ciąg znaków opisujący pojedynczą domenę, bądź też ewentualnie
tablicę ciągów znaków, uwzględniającą wtedy wiele różnych domen.
I to samo tyczy się wyrażeń regularnych,
więc możesz napisać sobie tutaj wydarzenie, które będzie dopasowywać
źródło do tego, co zostało określone w ustawieniach.
No i tak w zasadzie jeżeli chodzi o to by było na tyle, nie mam już tutaj nic więcej
do dodania, ale proponuję obejrzeć ten film raz jeszcze.
Ze względu na to, że wszystkie wymienione
przeze mnie tutaj przypadki z pewnością wiedzą Cię jeszcze niejednokrotnie.
Tymczasem dzięki za uwagę i do usłyszenia w kolejnej lekcji.