Skip to content
>_devvkit
$devvkit learn --librarie nestjs-guide

NestJS Guide

[nodejs][backend][typescript][api]
JavaScript / TypeScript
Install
npm install -g @nestjs/cli
nest new my-app --package-manager npm

NestJS brings Angular-style architecture to Node.js. It uses controllers (routing), providers/services (business logic), modules (organization), and decorators for metadata.

NestJS is framework-agnostic under the hood — it can run on Express (default) or Fastify via adapters. GraphQL, WebSockets, queues, and caching are first-class plugins.

Dependency injection is baked in. Providers are singletons by default. Guards control auth, interceptors transform responses, pipes validate inputs, and filters handle errors.

Setup

Create projectScaffold NestJS app.
nest new my-app --strict
cd my-app
npm run start:dev
Generate resourceCRUD module.
nest g resource users
# Generates module, controller, service, DTOs, entity

Controllers

ControllerRoute handler.
@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

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

  @Get(':id')
  findOne(@Param('id', ParseIntPipe) id: number) { return this.usersService.findOne(id) }

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

Providers

ServiceBusiness logic provider.
@Injectable()
export class UsersService {
  constructor(private readonly prisma: PrismaService) {}

  async findAll() { return this.prisma.user.findMany() }
  async findOne(id: number) { return this.prisma.user.findUnique({ where: { id } }) }
  async create(dto: CreateUserDto) { return this.prisma.user.create({ data: dto }) }
}

Modules

ModuleOrganize related code.
@Module({
  controllers: [UsersController],
  providers: [UsersService],
  imports: [PrismaModule],
})
export class UsersModule {}

Pipes & Validation

Validation pipeAuto-validate DTOs.
import { IsString, IsEmail, IsOptional } from 'class-validator'

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

  @IsEmail()
  email!: string

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

// main.ts:
app.useGlobalPipes(new ValidationPipe({ whitelist: true }))

Guards

Auth guardProtect routes.
@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest()
    return validateToken(request.headers.authorization)
  }
}

// Usage:
@UseGuards(AuthGuard)
@Get('profile')
getProfile() {}

Swagger

Swagger setupAuto-generated OpenAPI docs.
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'

const config = new DocumentBuilder()
  .setTitle('My API')
  .setVersion('1.0')
  .addBearerAuth()
  .build()
const document = SwaggerModule.createDocument(app, config)
SwaggerModule.setup('docs', app, document)