Routing i Środowisko Middleware w Express.js

Express.js to jeden z najpopularniejszych frameworków dla Node.js, który umożliwia łatwe tworzenie aplikacji webowych. W tym artykule zajmiemy się kluczowymi elementami, jakimi są routing oraz środowisko middleware. Poznanie tych aspektów pomoże Ci zrozumieć, jak tworzyć bardziej skalowalne i zorganizowane aplikacje webowe.

Routing w Express.js

Routing w Express to proces przypisywania zapytań HTTP do konkretnych funkcji obsługujących, czyli tras. W Express, trasy służą do zarządzania różnymi typami zapytań, takimi jak GET, POST, PUT, DELETE. Każda z tych metod odpowiada na inne potrzeby aplikacji.

1. Zasady Routingu: GET, POST, PUT, DELETE

  • GET: Służy do pobierania danych z serwera. Na przykład:
				
					app.get('/users', (req, res) => {
  res.send('Lista użytkowników');
});

				
			
  • POST: Używane do wysyłania nowych danych do serwera, na przykład przy rejestracji użytkownika:
				
					app.post('/users', (req, res) => {
  res.send('Dodano nowego użytkownika');
});

				
			
  • PUT: Służy do aktualizowania istniejących zasobów. Przykład:
				
					app.put('/users/:id', (req, res) => {
  res.send(`Aktualizacja użytkownika o ID ${req.params.id}`);
});

				
			
  • DELETE: Używane do usuwania zasobów. Przykład:
				
					app.delete('/users/:id', (req, res) => {
  res.send(`Usunięto użytkownika o ID ${req.params.id}`);
});

				
			

2. Dynamiczne Trasy i Parametry w URL (req.params)

Często potrzebujemy dynamicznych tras, na przykład do identyfikowania konkretnego użytkownika na podstawie jego identyfikatora (ID). W Expressie możesz to zrobić, dodając parametr do URL za pomocą dwukropka (:).

Przykład dynamicznej trasy:

				
					app.get('/users/:userId', (req, res) => {
  const userId = req.params.userId;
  res.send(`Informacje o użytkowniku o ID: ${userId}`);
});

				
			

Tutaj req.params.userId pozwala na dostęp do wartości userId w trasie.

3. Przekazywanie Danych przez Query String (req.query)

Query stringi są używane do przekazywania dodatkowych parametrów zapytania. Express udostępnia obiekt req.query, aby uzyskać te dane.

Przykład:

				
					app.get('/search', (req, res) => {
  const { term, page } = req.query;
  res.send(`Szukam dla terminu: ${term}, strona: ${page}`);
});

				
			

W powyższym przykładzie ?term=express&page=2 dołączy się do URL, co umożliwia filtrowanie lub paginację wyników wyszukiwania.

Middleware w Express.js

Middleware to podstawowy budulec aplikacji Express. Jest to funkcja, która ma dostęp do obiektu żądania (req), odpowiedzi (res) oraz następnej funkcji w kolejce (next). Middleware umożliwia przetwarzanie żądań przed dotarciem do ostatecznej funkcji obsługującej.

1. Co to jest Middleware i Jak Działa?

Middleware może pełnić różne zadania, takie jak:

  • Parsowanie danych wejściowych.
  • Autoryzacja i uwierzytelnianie.
  • Logowanie.

Podstawowy przykład middleware:

				
					app.use((req, res, next) => {
  console.log(`${req.method} ${req.url}`);
  next(); // Przechodzi do następnego middleware
});

				
			

Tutaj next() wskazuje, że żądanie powinno przejść do następnej funkcji middleware lub trasy.

2. Budowanie Własnego Middleware

Tworzenie własnego middleware jest proste. Poniżej znajdziesz przykład middleware, który sprawdza, czy użytkownik przesłał klucz API.

				
					const checkApiKey = (req, res, next) => {
  const apiKey = req.query.api_key;
  if (apiKey && apiKey === 'secret_key') {
    next(); // Jeśli klucz jest poprawny, kontynuuj
  } else {
    res.status(403).send('Nieprawidłowy klucz API');
  }
};

app.use(checkApiKey); // Użyj middleware dla wszystkich tras

				
			

3. Używanie Wbudowanych Middleware: express.json() i express.urlencoded()

Express ma kilka wbudowanych middleware, które ułatwiają przetwarzanie danych wejściowych:

  • express.json(): Przetwarza przychodzące żądania JSON.
				
					app.use(express.json());

				
			
  • express.urlencoded(): Przetwarza dane formularzy z kodowaniem URL.
				
					app.use(express.urlencoded({ extended: true }));

				
			

Powyższe middleware umożliwiają łatwe przetwarzanie danych z formularzy i żądań JSON bez potrzeby korzystania z zewnętrznych bibliotek.

Obsługa Błędów

Obsługa błędów jest kluczowym elementem tworzenia stabilnych aplikacji.

1. Łańcuch Obsługi Błędów w Express

W Expressie, middleware do obsługi błędów posiada cztery argumenty: err, req, res, next. Dzięki temu można przekazywać informacje o błędzie przez łańcuch middleware.

Przykład globalnego middleware do obsługi błędów:

				
					app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).send('Wewnętrzny błąd serwera');
});

				
			

2. Tworzenie Własnego Middleware do Obsługi Błędów

Stworzenie własnego middleware do obsługi błędów jest proste. W poniższym przykładzie tworzymy middleware, który obsługuje brak zasobów (404).

				
					app.use((req, res, next) => {
  res.status(404).send('Nie znaleziono strony');
});

				
			

Możesz również obsługiwać błędy na podstawie różnych warunków, np. błędy autoryzacji czy walidacji danych.

Podsumowanie

Routing i middleware są fundamentem Express.js. Znajomość tych elementów pomoże Ci zbudować elastyczne, skalowalne aplikacje.

  • Routing w Expressie opiera się na metodach HTTP, takich jak GET, POST, PUT, DELETE. Możesz korzystać z dynamicznych tras oraz przekazywać parametry w URL.
  • Middleware pozwala na tworzenie łańcuchów funkcji, które mogą przetwarzać żądania. Może to być middleware wbudowane (express.json(), express.urlencoded()), jak również własne.
  • Obsługa błędów jest możliwa dzięki specjalnym middleware do zarządzania różnymi typami błędów.

Znajomość tych narzędzi to klucz do tworzenia bardziej wydajnych aplikacji webowych w Express.js. Tworząc własne middleware i łańcuchy routingu, zyskujesz pełną kontrolę nad tym, jak Twoja aplikacja przetwarza i obsługuje żądania użytkowników.