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ę bardzo istotnym temu elementowi przepływu
informacji w naszej aplikacji, jakim jest walidacja.
Mianowicie, jak widać przygotowałem tutaj
bardzo prostą aplikację umożliwiającą dodanie komentarza.
Pominąłem tutaj wszelkie złożoności, aby nie utrudniać tego przykładu.
Musisz jednak wiedzieć, że mamy tutaj
aplikację działającą zarówno po stronie klienta, jak i serwera.
W przypadku tego pierwszego tak naprawdę jest to jeden komponent, który odpowiada
za wyświetlanie i obsługę logiki formularza.
W przypadku serwera mamy do czynienia z
jednym endpoint em, który przyjmuje dane na temat formularza, a następnie zapisuje
je w pamięci aplikacji w formie takiej tablice.
Zatem nie mamy tutaj do czynienia ani z bazą danych, ani z autoryzacją, ale
zasadniczo funkcja dodawania komentarza powinna tutaj działać.
Zatem jeżeli teraz przyjrzymy się jak to
wygląda po stronie frontendu, to myślę, że jeszcze będzie nam potrzebna konsola po
to, aby podejrzeć sobie co tutaj dokładniej się dzieje.
Przede wszystkim zadbałem o to, aby
użytkownik nie mógł dodać pustego komentarza.
W momencie gdy próbuje to zrobić, zostaje
wizualnie poinformowane o fakcie, że coś jest nie tak.
Naturalnie moglibyśmy wyświetlić dla niego
dodatkową informację, ale wydaje mi się, że jest to wystarczająco wymowne.
W każdym razie najważniejsze jest to, że na backend nie trafiają puste dane.
Drugim wątkiem, na które trzeba tutaj zwracać uwagę jest natychmiastowy feedback
dla użytkownika w momencie, gdy dodaję formularz.
Mianowicie zamiast czekać na to, aż uzupełnij formularz, a następnie go wyślij
i dopiero wtedy otrzyma informację o błędzie, informujemy go o tym natychmiast.
Teraz, jeżeli zdecydujemy się na dodanie
komentarza, to zwróci uwagę co tutaj dokładnie się dzieje.
Po pierwsze mieliśmy tutaj jakieś zapytanie, które wróciło odpowiedź ze
statusem 201 i wewnątrz niego poza treścią naszego komentarza pojawił się również
identyfikator, który wyświetli liczbę w tym miejscu.
W momencie gdy dodamy kolejny komentarz, on również zostanie tutaj odpowiednio
wyświetlony, przy czym w jego przypadku identyfikator się zmieni.
Chciałbym tutaj w tym momencie zwrócić
Twoją szczególną uwagę na to, co tutaj dokładnie się dzieje.
Przede wszystkim jeżeli chodzi o nasz
komponent, to zauważ, że tutaj w momencie wysłania zapytania do serwera o zapisanie
formularza odbieramy dane, które nam zwraca, a następnie to te dane
wykorzystujemy po to, aby wyświetlić je po stronie frontendu.
Teoretycznie moglibyśmy zrobić tak, aby wykorzystać dane wprowadzone przez
użytkownika po stronie frontendu i to na nich opierać cały frontend.
Rzecz w tym, że jeżeli teraz dodamy taki
komentarz, to okaże się, że teoretycznie mogłoby to działać, ponieważ komentarz
wyświetlił się i ten identyfikator też nie byłby nam tutaj potrzebny.
Ale wyobraź sobie sytuację, w której
chcemy dorobić możliwość edytowania tego komentarza W momencie, gdy opieramy się na
danych pochodzących z frontendu, nie mamy informacji o identyfikatorze i tym samym
dorobienie takiego przycisku nie jest możliwe.
Jednocześnie też w niektórych przypadkach
mogłoby się wydarzyć tak, że po stronie backendu dojdzie do jakiejś formy
transformacji danych, które zostały przesłane przez użytkownika, np.
transformacji składni Markdown.
Jeżeli teraz ponownie dodamy komentarz, no
to pomimo tego, że w naszej bazie danych znajduje się coś zupełnie innego, to po
stronie frontendu wyświetlamy coś zupełnie innego.
Oznacza to mniej więcej tyle, że zasada, o której mówiłem, dotycząca tego, aby
backend był źródłem nie ma tutaj zastosowania.
I tym samym doprowadzamy do obecnie nieprzyjemnych błędów.
Jeszcze akurat w tym przypadku mamy do
czynienia z komentarzem, więc teoretycznie trochę trudno tutaj cokolwiek popsuć.
Ale wyobraź sobie, że logika Twojej aplikacji jest nieco bardziej złożona i
nagle okazuje się, że zaczynają pojawiać się błędy, które naprawdę trudno naprawić.
W związku z tym, jeżeli chodzi o walidację
danych, to pamiętaj proszę o tym, aby przede wszystkim zadbać o to, aby.
Oczywiście uwzględniając decyzje projektowe designerów oraz UX designerów
uwzględnić to, w jaki sposób informujesz użytkownika o błędzie.
Następnie musisz upewnić się, że
przypadkowe dane nie trafią do Twojej aplikacji.
Mowa tutaj chociażby o pustej treści komentarza.
No i ostatecznie pamiętaj proszę, aby tak
zaprojektować backend, aby nie tylko zapisywać informacje, ale również wracać
do klienta w takiej formie, by mogły zostać wyświetlone użytkownikowi, a
dodatkowo ułatwiły Ci późniejszą pracę z nimi.
Mam tutaj na myśli chociażby wspomnianą wcześniej edycję.
Jednocześnie jako full stack developer
musisz zadbać jeszcze o pewne rzeczy, których tutaj pozornie nie widać.
Otóż wyobraź sobie teraz sytuację, że masz
do czynienia z użytkownikiem, który chce zrobić trochę problemu.
Zamiast dodać zwyczajny komentarz, dodaje np.
komentarz HTML.
Poza tym nic nie stoi na przeszkodzie, aby umieścić tutaj również jakiś skrypt.
W momencie, gdy w pełni zaufasz użytkownikowi i zapiszesz te informacje
bezpośrednio w bazie danych, to w niektórych sytuacjach możesz doprowadzić
do tego, że inni użytkownicy zobaczą coś, czego zobaczyć nie powinni.
Z tego powodu warto zabezpieczyć się na takie sytuacje.
Ale coś takiego.
Po stronie backendu.
Mianowicie zwróćcie uwagę na fakt, że
jeżeli dodam sobie raz jeszcze komentarz, a następnie zobaczę, że tak naprawdę jest
to zapytanie typu post na adres localhost 3000.
Zatem teraz mogę te informacje wykorzystać
po to, aby przesłać tutaj zupełnie swoje dane np.
tym razem. Pomimo tego, że nasza aplikacja blokuje
puste komentarze, to w tym przypadku będę chciał taki wysłać.
Zobaczy, że otrzymaliśmy tutaj status 201,
a to oznacza, że komentarz został zapisany w bazie.
Można powiedzieć, że akurat w tym przypadku nie jest to aż tak duży problem,
ale jednocześnie po stronie backendu również możesz popełnić pewne błędy, które
mogą doprowadzić do różnego rodzaju nadużyć.
Z tego powodu w jednej z kolejnych lekcji
również przyjrzymy się temu, w jaki sposób możemy kontrolować dane po stronie
backendu, tak aby nie trafiło do nas coś, czego nie chcemy.
A jeżeli chodzi o frontend, to by było na tyle.
Raz jeszcze tylko podkreślę, aby zadbać o
to, by użytkownik natychmiast otrzymywał feedback dotyczący podejmowanych przez
niego akcji, a następnie też abyśmy zadbali o to, aby to backend był zawsze
źródłem na temat informacji wyświetlanych po stronie frontendu.
Teraz dziękuję Ci za uwagę i zapraszam do kolejnej lekcji.