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. Где расположены основные файлы
| Компонент | Путь | Описание |
|---|---|---|
| Входная точка API | apps/api/src/main.ts | NestFactory + FastifyAdapter |
| Модули | apps/api/src//.module.ts | Логические блоки API |
| Контроллеры | apps/api/src//.controller.ts | REST-эндпоинты |
| Сервисы | apps/api/src//.service.ts | Логика API |
| DTO | apps/api/src/*/dto | Валидация входных данных |
| Prisma схема | apps/api/prisma/schema.prisma | Модель данных |
7. Что нужно знать разработчику
- как устроены контроллеры и сервисы;
- где определяются DTO;
- как подключён PrismaService;
- как регистрировать новые модули в AppModule.
На этом основы NestJS + Fastify считаются закрыты.