"Form gönderildi, fetch, JSON, sonra API rotasında ayrı bir handler, sonra bir de istemci tarafında hata yönetimi..." Klasik akışı kurmak çoğu zaman özenden çok kabaya gider. Server Actions ise bu yolculuğu tek durağa indiriyor: tarayıcıdan veritabanına aynı fonksiyon üzerinden. Ağ katmanını çerçeve devralır, siz iş kurallarına odaklanırsınız.

Sıfır API Rotası

Bir "use server" satırı fonksiyonu sunucuya taşır; istemci onu sanki yerel bir fonksiyonmuş gibi çağırır. Aynısı bir yorum formu için yeterli:

// app/yorum/form.tsx
"use server";

export async function yorumEkle(formData: FormData) {
  const icerik = String(formData.get("icerik") ?? "").trim();
  if (icerik.length < 3) return { hata: "Yorum çok kısa." };

  const yorum = await db.yorum.create({
    data: { icerik, onay: false },
  });
  revalidatePath("/yazi/" + yorum.slug);
  return { ok: true };
}

İstemcide ise sadece action={yorumEkle} demek yeterli. Ağ katmanı, JSON dönüştürmesi ve uç nokta listesi sizin yerinize yönetiliyor; tip güvenliği de uçtan uca korunuyor. revalidatePath çağrısı, mutasyon bittikten sonra ilgili sayfayı tazeler; yorum listesi bir sonraki istekte güncel gelir. Artıları dışında bir de alışma süresi var: fonksiyonun hem sunucuda hem istemcide "yaşadığını" kavramak, ilk haftada alışılmadık gelir. Kural basit: await'lenebilir her şey sunucuda kalır, arayüzle ilgili her şey istemcide.

Zarafetle Hata

useActionState hook'u, bekleyen durum ve hata mesajını tek pakette verir. Kullanıcıyı körü körüne bekletmemek için de pending bayrağını butona bağlayın. Buton pasifleşirken form değerlerinin korunduğunu da unutmayın; kullanıcı tek bir tuş vuruşuyla düzeltip yeniden gönderebilmelidir:

const [state, action, pending] = useActionState(yorumEkle, { ok: false });
return (
  <form action={action}>
    <textarea name="icerik" />
    <button disabled={pending}>
      {pending ? "Gönderiliyor..." : "Gönder"}
    </button>
  </form>
);

Kötü ağda çalışan bir uygulamada bu üç ayrıntı — pasif buton, anlamlı hata metni, korunmuş form verisi — kullanıcının uygulamanıza güvenini belirler. Sunucu tarafında hata fırlatmak yerine yapılandırılmış sonuç dönmek, istemcide eşleşen tip üzerinden işlenir. Kullanıcıya "nerede ve nasıl" hissi vermek, bir formun en sessiz kalite işaretidir; tuş basıldığında önce butonun pasifleşmesi, sonra net bir sonuç metni gelmesi, bekleme süresini iki kat daha kısa hissettirir.

Ne Zaman Kullanmamalı?

Yüksek trafikli bir genel API, webhook ya da farklı istemcilerin (mobil uygulama, entegrasyon) tüketdiği bir uç nokta geliştiriyorsanız klasik rota yazın; sürümleme, izleme ve önbellek katmanlarına ihtiyacınız olacak. Server Actions iç işleri hızlandıran bir kısayoldur; her yerde kullanmak zorunda olduğunuz bir dogma değildir. Form ve mutasyon ağırlıklı akışlarda ise API ortak katmanı olmadan, tarayıcıdan veritabanına en kısa ve en güvenli yolu sunar. Doğru ölçü, ekibinizin bakım yükünü azaltıp azaltmadığıdır. Bir sonraki projenizde ilk formu bir Server Action ile yazın; API rotası kurmaya geri dönüp dönmeyeceğinize o günden karar verin. Kısayol, bilinçli kullanıldığında bir mimari karar kadar değerlidir.