NestJS

Node.js Backend-Framework mit TypeScript - Angular-aehnliche Architektur, Dependency Injection, Enterprise-Patterns

TL;DR

Kurzfassung: NestJS ist Angular-ähnliche Architektur für Node.js-Backends - TypeScript, Dependency Injection und Enterprise-Patterns eingebaut.

Kernstärken:

  • TypeScript-first - Decorators und starke Typisierung überall
  • Dependency Injection - testbarer, modularer Code als Standard
  • CLI-Generatoren - Scaffolding für Module, Controller, Services
  • Enterprise-ready - Guards, Interceptors, Pipes, Filter

Core Concepts

Concept 1: Modules

Alles ist in Module organisiert. Jedes Feature bekommt sein eigenes Modul.

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

@Module({
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService],  // Share with other modules
})
export class UsersModule {}

Concept 2: Controllers + Services

Controller verarbeiten HTTP. Services verarbeiten Logik. DI verbindet sie.

// users.controller.ts
@Controller('users')
export class UsersController {
  constructor(private usersService: UsersService) {}  // DI

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

  @Post()
  create(@Body() dto: CreateUserDto) {
    return this.usersService.create(dto);
  }
}

// users.service.ts
@Injectable()
export class UsersService {
  private users = [];

  findAll() { return this.users; }
  create(dto) { this.users.push(dto); return dto; }
}

Concept 3: DTOs + Validation

Request-Validierung via class-validator Decorators:

import { IsString, IsEmail, IsOptional } from 'class-validator';

export class CreateUserDto {
  @IsString()
  name: string;

  @IsEmail()
  email: string;

  @IsOptional()
  @IsString()
  bio?: string;
}

Quick Start

Create Project

npm i -g @nestjs/cli
nest new my-app
cd my-app

Generate a Feature

nest g resource users
# Creates: module, controller, service, DTOs, tests

Run

npm run start:dev
# Open http://localhost:3000

Gotchas

Don’t forget to import modules

// ❌ Service won't be available
@Module({
  controllers: [OrdersController],
  providers: [OrdersService],
})
export class OrdersModule {}

// ✅ Import UsersModule to use UsersService
@Module({
  imports: [UsersModule],  // Import the module
  controllers: [OrdersController],
  providers: [OrdersService],
})
export class OrdersModule {}

Enable validation globally

// main.ts - required for DTOs to work
import { ValidationPipe } from '@nestjs/common';

app.useGlobalPipes(new ValidationPipe({
  whitelist: true,  // Strip unknown properties
  transform: true,  // Auto-transform types
}));

Async configuration

// ❌ Sync config - can't use env vars from ConfigService
TypeOrmModule.forRoot({ host: 'localhost' })

// ✅ Async config - inject ConfigService
TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  inject: [ConfigService],
  useFactory: (config: ConfigService) => ({
    host: config.get('DB_HOST'),
  }),
})

When to Use

Ideal für:

  • Große APIs
  • Enterprise-Anwendungen
  • Teams vertraut mit Angular
  • Microservices-Architektur

Weniger geeignet für:

  • Einfache Scripts oder kleine APIs (Express verwenden)
  • Serverless Functions (Cold-Start-Overhead)
  • Projekte ohne Decorators/DI

Vergleich:

FeatureNestJSExpressFastify
StrukturOpinionatedMinimalMinimal
TypeScriptEingebautAdd-onEingebaut
DIJaNeinNein
LernkurveMittelEinfachEinfach

Next Steps

Cheatsheet

PatternCode
Projekt erstellennest new name
Resource generierennest g resource name
Modul generierennest g module name
Service generierennest g service name
GET-Route@Get() / @Get(':id')
POST-Route@Post()
Path-Parameter@Param('id') id: string
Query-Parameter@Query('page') page: number
Body@Body() dto: CreateDto
Headers@Headers('auth') auth: string