۱۴۰۴/۰۸/۰۳ Nebular

Server Action در next js

Server Action چیه؟

Server Action یعنی تابعی که:

  • در سرور اجرا میشه
  • مستقیماً از کامپوننت (حتی فرم) در سمت کلاینت صدا زده میشه
  • نیازی به ساخت API Route و fetch نداره
  • به‌صورت خودکار serialized و validated میشه

مثلاً:

'use server'

import { revalidatePath } from 'next/cache'
import { db } from '@/lib/db'

export async function addPost(formData: FormData) {
  const title = formData.get('title')
  await db.post.create({ data: { title } })
  revalidatePath('/blog')
}

و در کلاینت فقط می‌گی:

<form action={addPost}>
  <input name="title" />
  <button type="submit">Add Post</button>
</form>

هیچ API endpoint، هیچ fetch، هیچ JSON parsing‌ای لازم نیست ✅


🔸 اما کجاها مناسب استفاده از Server Action هست؟

به‌صورت خلاصه:

هرجا که عملی روی داده انجام می‌دی (Mutation) ولی نیاز به مصرف عمومی API نداری.

یعنی اگر:

  • قراره فرم بفرسته داده‌ای رو بسازه/ویرایش کنه/حذف کنه
  • اون داده صرفاً داخل همین اپلیکیشن Next استفاده میشه
  • و نیازی نیست توسط کلاینت‌های خارجی یا موبایل استفاده بشه

✅ اونجا Server Actions عالیه.


✅ موارد مناسب استفاده از Server Actions

سناریوتوضیح
🔸 فرم‌های CRUD داخل داشبوردایجاد / ویرایش / حذف داده در DB
🔸 فرم Login یا Registerچون مستقیم با دیتابیس کار می‌کنی
🔸 آپلود فایل / ارسال فرموقتی داده از <form> میاد
🔸 فرم تماس یا feedbackچون فقط همین سایت ازش استفاده می‌کنه
🔸 ری‌ولیدیت کردن cacheبا revalidatePath() یا revalidateTag()
🔸 عملیات سروری کوچکمثل ارسال ایمیل، پردازش ساده، یا عملیات atomic

❌ مواردی که نباید از Server Action استفاده کنی

سناریودلیل
🔸 گرفتن داده برای صفحه (مثلاً پست‌های بلاگ)چون Server Action طراحی نشده برای data fetching. از fetch یا getServerSideProps/RSC استفاده کن
🔸 API عمومی (موبایل، کلاینت دیگر)چون Server Actions فقط از درون خود Next App قابل فراخوانی‌اند
🔸 Realtime APIs یا WebSocketServer Actions async و request-response هستند، نه realtime
🔸 عملیات cross-domainچون Server Action endpoint داخلی و امن است، نه برای بیرون

💡 در مورد مثال تو (پست‌های صفحه بلاگ)

❓ آیا برای گرفتن پست‌های بلاگ از Server Action استفاده کنیم؟

پاسخ: ❌ نه.

چرا؟
چون گرفتن پست‌ها (read operation) یعنی data fetching، نه mutation.

Server Action مخصوص mutationهاست، نه fetch.

برای گرفتن داده‌ها در صفحه بلاگ، بهتره از:

  • fetch() در Server Component
  • یا getServerSideProps() / generateStaticParams() (در App Router) استفاده کنی.

مثلاً:

// app/blog/page.tsx
import { getPosts } from '@/lib/api'

export default async function BlogPage() {
  const posts = await getPosts()
  return (
    <div>
      {posts.map(p => <div key={p.id}>{p.title}</div>)}
    </div>
  )
}

اینجا getPosts می‌تونه یه تابع async باشه که از دیتابیس یا API داده می‌گیره.
سرور اون رو هندل می‌کنه، نه مرورگر — دقیقاً همون مزیت RSC.


🔹 تفاوت ذهنی: Server Action ≠ Data Fetching

ویژگیServer ActionServer Component Fetch
هدفتغییر دادهدریافت داده
نوع درخواستPOSTGET
از کجا صدا زده میشهفرم یا handler کلاینتداخل Server Component
Cache behaviorمعمولاً invalidate می‌کنهمعمولاً cached / ISR
مناسب برایفرم‌ها و mutationsSSR و data fetching

🔒 مزیت بزرگ Server Actions

  • امنیت بالا (کد فقط در سرور اجرا میشه)
  • حذف API endpointهای تکراری
  • پشتیبانی از Type safety به‌صورت مستقیم
  • ادغام طبیعی با فرم‌ها و revalidatePath
  • حذف نیاز به fetch یا JSON parsing
  • در آینده می‌تونه از Streaming و optimistic UI پشتیبانی کنه (شبیه React mutations)

✨ جمع‌بندی

موردتوضیح
چه زمانی استفاده کنیموقتی فرم داری یا داده‌ای در سرور تغییر می‌کنی
چه زمانی استفاده نکنیموقتی صرفاً داری داده می‌گیری (read-only)
هدفجایگزین ساده‌تر برای API routes در عملیات داخلی
جایگزین برای API عمومی؟❌ نه
جایگزین برای data fetching؟❌ نه
Accept Cookies
Accept Cookies
[your-shortcode]