Tüm makaleler
Eğitim

NestJS, Prisma ve PostgreSQL ile REST API Oluşturma

NestJS, Prisma ORM ve PostgreSQL kullanarak üretime hazır REST API oluşturmak için eksiksiz eğitim — şema tasarımından endpoint'leri çalıştırmaya kadar.

Murat DUMLU24 Mart 202611 dk okuma

Prisma ve PostgreSQL ile NestJS, 2026'da mevcut en üretken backend stack'lerinden biridir. NestJS yapı ve bağımlılık enjeksiyonu sağlar, Prisma tip güvenliğiyle veritabanı erişimini yönetir ve PostgreSQL savaşta test edilmiş ilişkisel bir veritabanı sunar. İşte bu stack ile eksiksiz bir REST API nasıl oluşturulur.

Proje Kurulumu

Yeni bir NestJS projesi oluşturun ve Prisma'yı yükleyin:

npm i -g @nestjs/cli
nest new my-api
cd my-api
npm install prisma @prisma/client
npx prisma init

Bu işlem bir prisma/schema.prisma dosyası ve yer tutucu DATABASE_URL içeren bir .env oluşturur.

Veritabanı Bağlantısını Yapılandırın

.env'yi PostgreSQL bağlantı dizinizle güncelleyin:

DATABASE_URL="postgresql://postgres:password@localhost:5432/myapi_db"

PostgreSQL kurulu değilse en hızlı yol Docker'dır:

docker run --name my-postgres -e POSTGRES_PASSWORD=password -e POSTGRES_DB=myapi_db -p 5432:5432 -d postgres:16

Şemanızı Tanımlayın

prisma/schema.prisma'yı açın ve modellerinizi tanımlayın. Basit bir görev yönetimi API'si oluşturalım:

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "postgresql"
  url      = env("DATABASE_URL")
}

model User {
  id        String   @id @default(cuid())
  email     String   @unique
  name      String
  tasks     Task[]
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
}

model Task {
  id          String     @id @default(cuid())
  title       String
  description String?
  priority    Priority   @default(MEDIUM)
  status      TaskStatus @default(TODO)
  dueDate     DateTime?
  userId      String
  user        User       @relation(fields: [userId], references: [id])
  createdAt   DateTime   @default(now())
  updatedAt   DateTime   @updatedAt
}

enum Priority {
  LOW
  MEDIUM
  HIGH
}

enum TaskStatus {
  TODO
  IN_PROGRESS
  DONE
}

Tabloları oluşturmak için migration'ı çalıştırın:

npx prisma migrate dev --name init

Prisma Service Oluşturun

Uygulamanızın geri kalanının enjekte ettiği paylaşımlı bir Prisma servisi oluşturun:

// src/prisma/prisma.service.ts
import { Injectable, OnModuleInit } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';

@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit {
  async onModuleInit() {
    await this.$connect();
  }
}
// src/prisma/prisma.module.ts
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';

@Global()
@Module({
  providers: [PrismaService],
  exports: [PrismaService],
})
export class PrismaModule {}

Tasks Modülünü Oluşturun

// src/tasks/tasks.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
import { CreateTaskDto } from './dto/create-task.dto';

@Injectable()
export class TasksService {
  constructor(private prisma: PrismaService) {}

  async findAll(userId: string) {
    return this.prisma.task.findMany({
      where: { userId },
      orderBy: { createdAt: 'desc' },
    });
  }

  async findOne(id: string, userId: string) {
    const task = await this.prisma.task.findFirst({
      where: { id, userId },
    });
    if (!task) throw new NotFoundException('Task not found');
    return task;
  }

  async create(userId: string, dto: CreateTaskDto) {
    return this.prisma.task.create({
      data: { ...dto, userId },
    });
  }

  async update(id: string, userId: string, dto: Partial<CreateTaskDto>) {
    await this.findOne(id, userId); // bulunamazsa hata fırlatır
    return this.prisma.task.update({
      where: { id },
      data: dto,
    });
  }

  async remove(id: string, userId: string) {
    await this.findOne(id, userId);
    return this.prisma.task.delete({ where: { id } });
  }
}

DTO'larla Doğrulama

Doğrulama paketlerini yükleyin ve class-validator dekoratörlerini kullanın:

npm install class-validator class-transformer
// src/tasks/dto/create-task.dto.ts
import { IsString, IsOptional, IsEnum, IsDateString } from 'class-validator';
import { Priority, TaskStatus } from '@prisma/client';

export class CreateTaskDto {
  @IsString()
  title: string;

  @IsString()
  @IsOptional()
  description?: string;

  @IsEnum(Priority)
  @IsOptional()
  priority?: Priority;

  @IsDateString()
  @IsOptional()
  dueDate?: string;
}

main.ts'te doğrulamayı global olarak etkinleştirin:

app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));

Endpoint'lerinizi Test Edin

Çalıştıktan sonra (npm run start:dev) API'niz http://localhost:3000 adresinde kullanılabilir:

POST /tasks          → Görev oluştur
GET  /tasks          → Tüm görevleri listele
GET  /tasks/:id      → Bir görevi getir
PATCH /tasks/:id     → Görevi güncelle
DELETE /tasks/:id    → Görevi sil

PromptForge ile Kurulumu Atlayın

Bu eğitim, NestJS + Prisma + PostgreSQL kurulumunun temellerini ele aldı. Üretime hazır bir uygulama ayrıca kimlik doğrulama, hız sınırlama, hata yönetimi, Swagger dokümantasyonu, Docker yapılandırması ve CI/CD gerektirir. Bunların tümünü sıfırdan kurmak 1–2 gün sürer.

PromptForge tümünü üretir — şema, service'ler, controller'lar, kimlik doğrulama modülü, Dockerfile ve dokümantasyon — tek bir prompttan beş dakika içinde. Ücretsiz deneyin.

AI ile SaaS'ınızı oluşturmaya hazır mısınız?

Tek bir prompttan eksiksiz bir NestJS + Prisma backend oluşturun — ücretsiz deneyin.

Ücretsiz başla