Skip to main content

NestJS + Fastify

Как устроен бэкенд @lowcode/api: краткое объяснение фреймворков и их роль в проекте

🎯 Зачем эта страница

Цель — объяснить, как работает NestJS и Fastify в контексте lowcode-платформы:

  • что делает NestJS;
  • какая роль Fastify;
  • как устроены контроллеры, сервисы, middleware;
  • как это связано с файлами в apps/api;
  • какой минимум знаний нужен, чтобы добавлять эндпоинты.

1. Что такое NestJS

NestJS — это структурный фреймворк для Node.js, который предоставляет:

  • модули, контроллеры, сервисы;
  • систему внедрения зависимостей (DI);
  • пайпы, фильтры, middleware;
  • адаптеры HTTP-платформ (Express или Fastify).

Важно: NestJS не сервер, он оборачивает выбранный движок.


2. Что такое Fastify

Fastify — высокопроизводительный HTTP-сервер для Node.js.

Преимущества:

  • очень высокая скорость;
  • строгая схема-валидация;
  • модульность и хуки.

Минимальный пример Fastify:

import Fastify from 'fastify';
const app = Fastify();
app.get('/hello', async () => ({ message: 'Hello, world!' }));
await app.listen({ port: 3000 });

3. Как NestJS использует Fastify

В apps/api/src/main.ts:

const app = await NestFactory.create<NestFastifyApplication>(AppModule, new FastifyAdapter());

Это означает, что:

  • Fastify принимает HTTP-запросы;
  • NestJS маршрутизирует их в контроллеры;
  • пайпы/фильтры выполняются поверх Fastify.

Поток данных:

[ builder-web ] → HTTP → [ Fastify ] → [ Nest Controller ] → [ Service ] → [ Prisma ]

4. Архитектура NestJS на примере платформы

4.1. Модули

apps/api/src/app.module.ts собирает модули проекта:

@Module({
imports: [ProjectsModule, VersionsModule, DslModule, CompileModule, DatabaseModule],
})
export class AppModule {}

4.2. Контроллеры

@Controller('projects')
export class ProjectsController {
constructor(private readonly service: ProjectsService) {}

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

4.3. Сервисы

@Injectable()
export class ProjectsService {
constructor(private readonly prisma: PrismaService) {}

findAll() {
return this.prisma.project.findMany();
}
}

4.4. Пайпы и middleware

В main.ts:

app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));

5. Пример: добавление нового эндпоинта

Создаём apps/api/src/health/health.controller.ts:

@Controller('health')
export class HealthController {
@Get()
check() {
return { status: 'ok' };
}
}

Добавляем модуль и включаем его в AppModule. После этого:

GET /health → { "status": "ok" }

6. Где расположены основные файлы

КомпонентПутьОписание
Входная точка APIapps/api/src/main.tsNestFactory + FastifyAdapter
Модулиapps/api/src//.module.tsЛогические блоки API
Контроллерыapps/api/src//.controller.tsREST-эндпоинты
Сервисыapps/api/src//.service.tsЛогика API
DTOapps/api/src/*/dtoВалидация входных данных
Prisma схемаapps/api/prisma/schema.prismaМодель данных

7. Что нужно знать разработчику

  • как устроены контроллеры и сервисы;
  • где определяются DTO;
  • как подключён PrismaService;
  • как регистрировать новые модули в AppModule.

На этом основы NestJS + Fastify считаются закрыты.