Пошук уроків, статей та іншого контенту
Де живе бізнес-логіка в NestJS-застосунку — і навіщо відокремлювати її від контролерів.
Провайдер — будь-який клас, позначений декоратором @Injectable, яким NestJS керує через свій контейнер впровадження залежностей (детально в наступному уроці): створює екземпляр, передає його туди, де він потрібен як залежність. Найпоширеніший тип провайдера — сервіс, що інкапсулює бізнес-логіку та роботу з даними для конкретної предметної області.
import { Injectable } from "@nestjs/common";
interface Cat {
id: string;
name: string;
age: number;
}
@Injectable()
export class CatsService {
private cats: Cat[] = [];
findAll(): Cat[] {
return this.cats;
}
findOne(id: string): Cat | undefined {
return this.cats.find((cat) => cat.id === id);
}
create(data: { name: string; age: number }): Cat {
const cat: Cat = { id: crypto.randomUUID(), ...data };
this.cats.push(cat);
return cat;
}
}Відокремлення бізнес-логіки від HTTP-шару контролера дає кілька практичних переваг: сервіс можна протестувати без підняття цілого HTTP-сервера (просто створити екземпляр і викликати методи), той самий сервіс можна перевикористати з кількох контролерів чи навіть із фонового завдання (черга, cron-задача), і логіка застається зрозумілою навіть коли HTTP-специфіка (заголовки, статус-коди) не заважає її читати.
Провайдер має бути зареєстрований у масиві providers модуля (попередній урок), щоб NestJS знав про його існування й міг створити екземпляр, коли він потрібен як залежність:
@Module({
controllers: [CatsController],
providers: [CatsService], // без цього рядка CatsService не можна впровадити нікуди
})
export class CatsModule {}Забути @Injectable() на класі сервісу — NestJS не зможе керувати його життєвим циклом і впровадити як залежність.
Забути зареєструвати сервіс у providers модуля — при спробі впровадити його NestJS видасть помилку про нерозв'язану залежність під час старту застосунку.
Тримати бізнес-логіку прямо в контролері «бо так швидше зараз» — з ростом проєкту це ускладнює і тестування, і повторне використання цієї логіки деінде.
Провайдер — клас, позначений @Injectable і зареєстрований у providers модуля, яким керує NestJS; сервіс — найпоширеніший тип провайдера, що інкапсулює бізнес-логіку окремо від HTTP-шару контролера. Такий поділ робить логіку тестованою без підняття HTTP-сервера і повторно використовуваною з кількох місць застосунку.