NestJS Framework
Progresywny framework Node.js z TypeScript — DI, moduły, Guards, Interceptors, mikrousługi przez RabbitMQ/Kafka i GraphQL API.
6 kluczowych komponentów NestJS
Modules, Controllers, Services, Guards, Interceptors i Pipes — architektura NestJS inspirowana Angular, z DI container i dekoratorami TypeScript.
Modules (@Module)
Aplikacja / FeatureOrganizacja i enkapsulacja features
UsersModule, AuthModule, DatabaseModule
Controllers (@Controller)
HTTP LayerObsługa HTTP requestów
@Get('/users') @Post('/users')
Services (@Injectable)
Business LogicLogika biznesowa i DI
UserService, AuthService
Guards (@UseGuards)
SecurityAutoryzacja i kontrola dostępu
JwtAuthGuard, RolesGuard
Interceptors
Cross-cuttingTransformacja requesta/response
LoggingInterceptor, CacheInterceptor
Pipes (@UsePipes)
Input ValidationWalidacja i transformacja danych
ValidationPipe, ParseIntPipe
Często zadawane pytania
Co to jest NestJS i dlaczego jest popularny w ekosystemie Node.js?
NestJS: progresywny framework Node.js (Kamil Mysliwiec, 2017). TypeScript first. Inspirowany Angular (dekoratory, DI, moduły). Nadbudowany nad Express lub Fastify. Filozofia: struktura, skalowanie, enterprise-ready. Kluczowe koncepty: Moduły (@Module): grupują powiązane feature. imports, exports, providers, controllers. Kontrolery (@Controller): obsługa HTTP requestów. @Get, @Post, @Put, @Delete, @Patch. @Param, @Body, @Query — dekoratory. Providerzy (@Injectable): services, repositories, factories. Wstrzykiwane przez DI container. Pipes: transformacja i walidacja danych wejściowych. ValidationPipe (class-validator integracja). ParseIntPipe, ParseUUIDPipe. Guards: autoryzacja (czy ma dostęp). AuthGuard, RolesGuard. Interceptors: cross-cutting concerns. Logging, transformacja response, cache. Middleware: Express-compatible. Exception Filters: obsługa błędów. HttpExceptionFilter. DTOs z class-validator: @IsEmail() email: string. @IsString() @MinLength(8) password: string. Automatyczna walidacja z ValidationPipe. NestJS CLI: nest generate module users. nest generate controller users. nest generate service users. Hot reload, compilation. Baza danych: @nestjs/typeorm, @nestjs/prisma (TypeORM lub Prisma). Mikro-serwisy: @nestjs/microservices. Transport: TCP, Redis, RabbitMQ, Kafka, gRPC. Event patterns.
NestJS Guards, Interceptors i Exception Filters — wzorce cross-cutting?
Guards (@UseGuards): boolean — czy request przejść dalej. canActivate(context: ExecutionContext): boolean | Promise. AuthGuard('jwt') — Passport.js integration. @UseGuards(JwtAuthGuard, RolesGuard) — stack guards. Implementacja: @Injectable(). implements CanActivate. canActivate(context) {const request = context.switchToHttp().getRequest(). return validateUser(request)}. RBAC z dekoratorem: @Roles('admin'). @SetMetadata('roles', roles). Reflector.get() w guard. Interceptors (@UseInterceptors): przed i po obsłudze requesta. Transformacja response. Logging. Cache. Timeout. Implementacja: implements NestInterceptor. intercept(context, next: CallHandler) {return next.handle().pipe(map(data => transform(data)))}. TransformInterceptor — opakuj response. LoggingInterceptor — loguj każdy request. TimeoutInterceptor — throw po 5 sekundach. Exception Filters (@Catch): obsługa błędów globalnie lub per endpoint. @Catch(HttpException). catch(exception, host: ArgumentsHost). implements ExceptionFilter. Globalna rejestracja: app.useGlobalFilters(new HttpExceptionFilter()). Moduł-level: @Module({providers: [{provide: APP_FILTER, useClass: HttpExceptionFilter}]}). Pipes (@UsePipes): transformacja i walidacja. ValidationPipe — class-validator + class-transformer. ParseIntPipe — string -> number. Custom: implements PipeTransform. transform(value, metadata): PipeTransform. Kolejność wykonania: Middleware -> Guard -> Interceptor (before) -> Pipe -> Controller -> Interceptor (after) -> Exception Filter.
NestJS z bazą danych — TypeORM, Prisma i pattern Repository?
TypeORM z NestJS: @nestjs/typeorm. TypeOrmModule.forRoot(config) w AppModule. @Entity('users') class User. @Column() email: string. @InjectRepository(User) userRepository: Repository. CRUD: userRepository.find(), findOne(), save(), delete(). Relacje: @OneToMany, @ManyToOne, @ManyToMany. Prisma z NestJS: @nestjs/prisma lub własny serwis. PrismaService: Injectable, OnModuleInit, OnModuleDestroy. this.prisma.$connect(), $disconnect(). Wstrzyknij do UserService. prisma.user.findMany(), create(), update(), delete(). Zalecane: Prisma preferowany nad TypeORM (lepsza DX). Repository Pattern: oddzielenie logiki DB od logiki biznesowej. UserRepository: @Injectable(). findById(id). findByEmail(email). save(user). UserService: wstrzykuje UserRepository. Logika biznesowa. Brak bezpośredniego DB access. Transaction management: TypeORM: queryRunner.startTransaction(). Prisma: prisma.$transaction([...]). NestJS Transaction Interceptor (własny). Data Mapper vs Active Record: TypeORM obsługuje oba. Nest + Prisma = Data Mapper domyślnie. CQRS w NestJS: @nestjs/cqrs. Commands (zapis) + Queries (odczyt). CommandBus.execute(), QueryBus.execute(). EventBus.publish(). Event sourcing integration. Seeding: DatabaseSeeder z TypeORM. Prisma seed script (prisma/seed.ts). Faker.js dla test data.
NestJS WebSocket, microservices i GraphQL?
NestJS WebSocket: @nestjs/websockets. @WebSocketGateway(port). @SubscribeMessage('message'). @MessageBody(). Emitowanie: this.server.emit('message', data). Rooms: socket.join(room). Client: this.server.to(room).emit(). Adaptery: Socket.io (domyślny), ws (lightweight). NestJS Microservices: @nestjs/microservices. Transports: TCP, Redis (Pub/Sub), RabbitMQ, Kafka, gRPC, MQTT, NATS. Pattern: message-based (request-response), event-based (fire-and-forget). ClientsModule.register([{name: 'MATH_SERVICE', transport: Transport.TCP}]). @Client() mathClient. this.mathClient.send({cmd: 'sum'}, [1,2,3]). Event: this.mathClient.emit('user_created', user). NestJS GraphQL: @nestjs/graphql + @nestjs/apollo lub @nestjs/mercurius. Code-first (TypeScript classes -> schema) lub schema-first (SDL -> classes). @Resolver(() => User). @Query(() => [User]) findAll(). @Mutation(() => User) createUser(@Args() dto). @ResolveField(() => [Post]) posts(@Parent() user: User). DataLoader pattern — N+1 problem. nestjs-dataloader. Subscription: @Subscription(() => User). Swaggerr (OpenAPI): @nestjs/swagger. @ApiProperty() na DTOs. SwaggerModule.setup('/api', app, document). Auto-generuje dokumentację API. Kolejność dekoratorów na endpoint: @Get(':id') @UseGuards(JwtAuthGuard) @UseInterceptors(LoggingInterceptor) @UsePipes(ValidationPipe) async findOne(@Param('id') id: string).
NestJS vs Express vs Fastify vs Hono — kiedy wybrać NestJS?
Express: minimalistyczny (2010). Niestrukturyzowany. JavaScript first. Ogromny ekosystem. Dowolna struktura. Brak opinii. Fastify: szybszy niż Express (JSON serialization, schema validation). Plugin system (hooks, decorators). TypeScript support. Schema-based validation. Hono: ultra-lightweight (2022). Edge-ready (Cloudflare Workers, Deno). 14KB. Minimalistyczny API. Web standards (Request/Response). Bardzo szybki. NestJS: pełny framework. Opinionated (strukturyzowany). TypeScript mandatory. DI container. Moduły. Dekoratory. Angular-like. Wolniejszy booting niż Fastify/Express (DI overhead). Kiedy NestJS: duże enterprise projekty. Zespoły z Angular/Spring background. Potrzebujesz struktury i konwencji. Mikroserwisy (wbudowany support). Bogatszy ekosystem (@nestjs/*). Kiedy Fastify: performance krytyczny. Prostszy projekt. Nie potrzebujesz DI. Kiedy Hono: edge computing. Bun/Deno runtime. Ultra-lightweight API. Cloudflare Workers. Kiedy Express: legacy. Maximum flexibility. Tiny projekty. Kiedy tRPC: type-safe, bez REST, Next.js. NestJS + Fastify: NestJS może używać Fastify pod spodem. FastifyAdapter zamiast ExpressAdapter. Lepszy performance. NestJS learning curve: wysoka (dekoratory, DI, pipes, guards, filters, modules). Warte dla dużych projektów.
Powiązane artykuły
Skontaktuj się z nami
Porozmawiajmy o Twoim projekcie. Bezpłatna wycena w ciągu 24 godzin.
Wyślij zapytanie
Telefon
+48 790 814 814
Pon-Pt: 9:00 - 18:00
adam@fotz.pl
Odpowiadamy w ciągu 24h
Adres
Plac Wolności 16
61-739 Poznań
Godziny pracy
Wolisz porozmawiać?
Zadzwoń teraz i porozmawiaj z naszym specjalistą o Twoim projekcie.
Zadzwoń teraz