kontakt
Software house
>
Blog
>
Dekoratory w NestJS

Dekoratory w NestJS

Data wpisu
Dawid Jażdżewski
Autor
Dawid Jażdżewski
Programowanie

Dekoratory są bardzo dobrze znane w wielu językach programowania (np. Python), jednak w JavaScript są w dalszym ciągu relatywnie nowe. Są one wyrażeniami, które zwracają funkcje, a jako argumenty przyjmują target, nazwę oraz tak zwany property descriptor. Ich zadaniem jest możliwość wywoływania funkcji wyższego rzędu (ang. Higher-Order Functions) w przyjazny dla developera sposób - z wykorzystaniem znaku “@”. 

W Nest dekoratory są stosowane m.in. do deklaracji:

  • modułów - @Module(), 
  • kontrolerów- @Controller(),
  • klas, które mogą być wstrzykiwane (dependency injection), najczęściej serwisy - @injectable(). 

Nest udostępnia również zestaw przydatnych dekoratorów dla parametrów, których można używać razem z protokołem HTTP:

  • @Request(), @Req(),
  • @Response(), @Res(),
  • @Next(),
  • @Session(),
  • @Param(param?: string),
  • @Body(param?: string),
  • @Query(param?: string),
  • @Headers(param?: string),
  • @Ip(),
  • @HostParam().

Łączenie dekoratorów

Nic nie stoi na przeszkodzie, aby wykorzystać wiele dekoratorów naraz dla jednej funkcji. Można tego dokonać na dwa sposoby - wywołując dekoratory jeden pod drugim

@Get()
@HttpCode(HttpStatus.OK)
async findAll() {
  return await this.usersService.findAll();
}


lub za pomocą funkcji applyDecorators dostarczanej przez Nest. Ten sposób wymagał będzie stworzenia nowego dekoratora, który połączy nam wszystkie wymagane dekoratory:

const GetWithOkHttpStatus = () => applyDecorators(
  Get(),
  HttpCode(HttpStatus.OK)


@GetWithOkHttpStatus()
async findAll() {
  return await this.usersService.findAll();
}

Tworzenie własnych dekoratorów 

Można tego dokonać wykorzystując funkcję createParamDecorator - również dostarczanej przez Nest.

const CarDecorator = createParamDecorator(

  (data: unknown, ctx: ExecutionContext) => {

    const request = ctx.switchToHttp().getRequest();

    return request.car;

  },

);

Powyższy przykład pokazuje jak w prosty sposób wyciągnąć klucz “car” z obiektu request, by następnie użyć go w metodzie obsługującej daną trasę.

@Get()

async findOne(@Car() car: Car) {

  console.log(car);

}

Podsumowanie 

Dekoratory są narzędziem, które pozwala zachować utrzymywać czystość kodu na równi z jego funkcjonowaniem. Mimo tego, że nie są one zbyt popularne w języku JavaScript, Nest wykorzystuje je w każdym zakątku aplikacji w sposób łatwy i przejrzysty. 

Ostatnie Wpisy