Centrum wiedzy o technologiach i pracy w IT
nestjs

Wprowadzenie do NestJS. Twórz wydajne aplikacje

Ostatnia aktualizacja 6 listopada, 2023

NestJS to nowoczesny framework dla aplikacji serwerowych Node.js. Wykorzystuje TypeScript oraz nowoczesne elementy JavaScriptu. Jego elastyczność oraz modułowość sprawiają, że doskonale nadaje się do budowy efektywnych, skalowalnych aplikacji mikroserwisowych, jak również tradycyjnych aplikacji monolitycznych. Zapewnia on szereg gotowych do użycia mechanizmów związanych z tworzeniem API, obsługą błędów, a także integracją z bazami danych.

Nie udało się zapisać Twojej subskrypcji. Spróbuj ponownie.
Udało się! Widzimy się niebawem – newsletter wysyłamy w każdy wtorek

Otrzymuj za darmo unikalne poradniki, dane i wiedzę o pracy w IT – dostarczane co tydzień

Klikając “Zapisz mnie” wyrażasz zgodę na otrzymywanie e-maili od redakcji, a także ofert partnerów oraz akceptujesz naszą Politykę prywatności.

Architektura NestJS

NestJS wykorzystuje architekturę modułową, która ułatwia organizację kodu i jego ponowne użycie. Serce każdej aplikacji opartej na tym frameworku to moduły, kontrolery oraz serwisy.

W poniższym fragmencie kodu definiujemy moduł UsersModule, który agreguje kontrolery oraz serwisy związane z użytkownikami. Kontroler zajmuje się obsługą żądań HTTP, natomiast serwis zawiera logikę biznesową.

import { Module } from '@nestjs/common';
import { UsersController } from './users.controller';
import { UsersService } from './users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

Cały proces zaczyna się od importowania niezbędnych elementów:

  • Module to dekorator pochodzący z pakietu @nestjs/common, który jest używany do oznaczenia klasy jako moduł w NestJS.
  • UsersController to klasa kontrolera, która została zdefiniowana w pliku users.controller.ts.
  • UsersService to klasa serwisu, która została zdefiniowana w pliku users.service.ts.

Dekorator @Module({}) jest najważniejszym elementem, który określa metadane modułu:

  • controllers: [UsersController] określa, że w ramach danego modułu używany będzie UsersController. Kontroler ten będzie obsługiwał przychodzące żądania HTTP związane z użytkownikami, takie jak pobieranie danych użytkowników, ich aktualizacja czy usuwanie.
  • providers: [UsersService] informuje NestJS, że w modułach będą dostępne pewne usługi – w tym przypadku UsersService. To właśnie serwis zawiera logikę biznesową aplikacji, a moduł dzięki temu zapisowi wie, że powinien go utworzyć i umożliwić wstrzyknięcie jako zależność tam, gdzie będzie to potrzebne.

Na koniec za pomocą export class UsersModule {} eksportowana jest klasa UsersModule, dzięki czemu może być wykorzystana w innych częściach aplikacji. Szczególnie podczas kompozycji głównego modułu aplikacji, który agreguje wszystkie moduły w systemie.

Kontrolery w NestJS

Kontroler w NestJS odpowiada za obsługę przychodzących żądań i zwracanie odpowiedzi. Jest to klasa z dekoratorami, które definiują trasy oraz typy żądań.

import { Controller, Get } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}

  @Get()
  findAll() {
    return this.usersService.findAll();
  }
}

W tym przykładzie kontroler UsersController ma jedną ścieżkę /users, która reaguje na żądania typu GET. Metoda findAll korzysta z serwisu UsersService, aby pobrać i zwrócić dane wszystkich użytkowników.

Na początku importujemy niezbędne elementy:

  • Controller oraz Get to dekoratory z pakietu @nestjs/common. Dekorator Controller jest używany do oznaczania klasy jako kontrolera, który obsługuje żądania HTTP. Get to dekorator metody, który wskazuje, że dana metoda będzie obsługiwała żądania HTTP GET.

Następnie:

  • UsersService jest serwisem, który został zaimportowany z pliku users.service.ts i będzie wykorzystywany do wykonania operacji związanych z użytkownikami, jak na przykład pobieranie danych użytkowników.

Dekorator @Controller('users') ma zastosowanie w klasie UsersController i ustawia podstawową ścieżkę dla wszystkich metod w tym kontrolerze. W tym przypadku wszystkie metody kontrolera UsersController będą dostępne pod ścieżką /users.

Wewnątrz klasy UsersController znajduje się konstruktor, który tworzy prywatne pole usersService. Dzięki zastosowaniu mechanizmu iniekcji zależności (private usersService: UsersService), instancja UsersService wstrzykuje się automatycznie przez NestJS. Pozwala to na używanie metod tego serwisu wewnątrz kontrolera.

Metoda findAll:

  • Jest ozdobiona dekoratorem @Get(), który wskazuje, że ta metoda będzie obsługiwała żądania GET wysłane na ścieżkę /users. Ponieważ nie określiliśmy żadnej dodatkowej ścieżki w dekoratorze @Get, przyjmuje ona domyślnie ścieżkę podstawową kontrolera.
  • Wewnątrz metody findAll, wywołujemy metodę findAll z serwisu usersService, który powinien zwrócić listę wszystkich użytkowników.

Dalsza część tekstu znajduje się pod materiałem wideo:

Serwisy

Serwisy są miejscem, gdzie umieszcza się logikę biznesową aplikacji. NestJS promuje zasadę oddzielenia logiki biznesowej od logiki transportu. Umożliwia to lepszą organizację kodu i ułatwia testowanie.

import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  private readonly users = [];

  findAll() {
    return this.users;
  }
}

W tej części kodu mamy serwis UsersService, który zawiera metodę findAll zwracającą listę użytkowników. Serwis łatwo wstrzykuje się do kontrolera za pomocą mechanizmu Dependency Injection. W dalszych krokach można go użyć do wykonania bardziej złożonych operacji związanych z użytkownikami.

  • Importowany jest dekorator Injectable z pakietu @nestjs/common. Dekorator ten oznacza, że klasą może zarządzać system kontroli zależności NestJS. Oznacza to, że Nest będzie wiedział, jak tworzyć i zarządzać instancjami tej klasy oraz jak je wstrzykiwać do innych części aplikacji, takich jak kontrolery.
  • Deklaracja @Injectable() bezpośrednio nad klasą UsersService sygnalizuje, że ta klasa jest serwisem, czyli może być wstrzyknięta jako zależność w innych klasach.
  • Klasa UsersService zawiera jedną właściwość: users, która jest prywatną tablicą, zapewne przeznaczoną do przechowywania danych o użytkownikach. Użycie private readonly wskazuje, że ta tablica nie może być modyfikowana z zewnątrz klasy, a readonly sugeruje, że nie można zmieniać referencji tej tablicy po zainicjalizowaniu.
  • W klasie znajduje się metoda findAll(), która ma za zadanie zwrócić zawartość tablicy users. Ponieważ nie ma tu żadnego mechanizmu persystencji, jak baza danych, zwraca się po prostu pusta tablica, którą zainicjowano w momencie tworzenia instancji serwisu.

Czytaj także:

Wzorce projektowe – czym są?

Wprowadzenie do systemu klas adresów IP

Total
0
Shares
_podobne artykuły