npm i -g @nestjs/clinest new nestjs-app-name
npm install class-validator class-transformer
In eslint.config.mjs, change:
projectService: true// toprojectService: {tsconfig: 'tsconfig.json',},
npx nest g module usersnpx nest g service usersnpx nest g controller users
my-app/├── src/│ ├── users/│ │ ├── dto/│ │ │ └── create-user.dto.ts│ │ ├── user.entity.ts│ │ ├── users.module.ts│ │ ├── users.service.ts│ │ └── users.controller.ts│ ├── app.module.ts│ └── main.ts├── docker-compose.yml├── Dockerfile├── .env├── package.json
.envNODE_ENV=developmentDB_HOST=postgresDB_PORT=5432DB_USER=postgresDB_PASS=postgresDB_NAME=nestdbPORT=3000
docker-compose.ymlservices:postgres:image: postgres:16restart: unless-stoppedenvironment:POSTGRES_USER: postgresPOSTGRES_PASSWORD: postgresPOSTGRES_DB: nestdbports:- "5433:5432"volumes:- pgdata:/var/lib/postgresqlpgadmin:image: dpage/pgadmin4restart: unless-stoppedenvironment:PGADMIN_DEFAULT_EMAIL: admin@example.comPGADMIN_DEFAULT_PASSWORD: adminports:- "5050:80"depends_on:- postgresapp:build: .ports:- "3000:3000"depends_on:- postgresenv_file:- .envvolumes:- .:/app- /app/node_modulescommand: npm run start:devvolumes:pgdata:
DockerfileFROM node:24-alpineWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .EXPOSE 3000CMD ["npm", "run", "start:dev"]
src/main.tsimport { NestFactory } from '@nestjs/core';import { AppModule } from './app.module';import { ValidationPipe } from '@nestjs/common';async function bootstrap() {const app = await NestFactory.create(AppModule);app.useGlobalPipes(new ValidationPipe({transform: true,whitelist: true,forbidNonWhitelisted: true,}),);await app.listen(process.env.PORT ?? 3000);}bootstrap();
src/app.module.tsimport { Module } from '@nestjs/common';import { TypeOrmModule } from '@nestjs/typeorm';import { ConfigModule, ConfigService } from '@nestjs/config';import { UsersModule } from './users/users.module';@Module({imports: [ConfigModule.forRoot({ isGlobal: true }),TypeOrmModule.forRootAsync({inject: [ConfigService],useFactory: (config: ConfigService) => ({type: 'postgres',host: config.get<string>('DB_HOST'),port: Number(config.get<string>('DB_PORT')),username: config.get<string>('DB_USER'),password: config.get<string>('DB_PASS'),database: config.get<string>('DB_NAME'),autoLoadEntities: true,synchronize: true,}),}),UsersModule,],})export class AppModule {}
src/users/user.entity.tsimport { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';@Entity()export class User {@PrimaryGeneratedColumn()id!: number;@Column()name!: string;@Column({ unique: true })email!: string;}
src/users/users.module.tsimport { Module } from '@nestjs/common';import { TypeOrmModule } from '@nestjs/typeorm';import { User } from './user.entity';import { UsersService } from './users.service';import { UsersController } from './users.controller';@Module({imports: [TypeOrmModule.forFeature([User])],providers: [UsersService],controllers: [UsersController],})export class UsersModule {}
src/users/users.service.tsimport { Injectable } from '@nestjs/common';import { InjectRepository } from '@nestjs/typeorm';import { Repository } from 'typeorm';import { User } from './user.entity';@Injectable()export class UsersService {constructor(@InjectRepository(User)private repo: Repository<User>,) {}create(data: Partial<User>) {const user = this.repo.create(data);return this.repo.save(user);}findAll() {return this.repo.find();}}
src/users/users.controller.tsimport { Controller, Get, Post, Body } from '@nestjs/common';import { UsersService } from './users.service';@Controller('users')export class UsersController {constructor(private service: UsersService) {}@Post()create(@Body() body: any) {return this.service.create(body);}@Get()findAll() {return this.service.findAll();}}
src/users/dto/create-user.dto.tsimport { IsEmail, IsNotEmpty, IsString } from 'class-validator';export class CreateUserDto {@IsString()@IsNotEmpty()name!: string;@IsEmail()email!: string;}
// run with dockerdocker compose up -d --build// stopdocker compose down
POST http://localhost:3000/users
{"name": "Daniel","email": "daniel@test.com"}
GET http://localhost:3000/users
http://localhost:5050
Login:
admin@example.comadmin
Connect DB:
Host: postgresPort: 5432