Home / Panduan / Integrasi Backend Formulir Next.js (Router Aplikasi & Tindakan Server)
PANDUAN INTEGRASI · FRONTEND & NEXT.JS

Integrasi Backend Formulir Next.js (Router Aplikasi & Tindakan Server)

Panduan implementasi TypeScript dan React yang lengkap untuk menangani formulir kontak di Next.js 14/15 menggunakan titik akhir Lugatu dan Tindakan Server tanpa paparan kredensial.

1. Arsitektur Router Aplikasi Next.js dengan Tindakan Server

Tindakan Server Next.js dijalankan secara eksklusif di server, menjadikannya ideal untuk mengirimkan pertanyaan dengan kunci API Lugatu pribadi tanpa mengungkap rahasia dalam bundel klien.

app/actions/contact.ts typescript
'use server';

export async function submitContact(prevState: any, formData: FormData) {
  // Silent rejection of automated bot submissions via honeypot trap
  const honeypot = (formData.get('_gotcha') as string) || '';
  if (honeypot) {
    return { success: true, error: null };
  }

  const name = formData.get('name') as string;
  const email = formData.get('email') as string;
  const message = formData.get('message') as string;

  if (!name || !email || !message) {
    return { success: false, error: 'All fields are required.' };
  }

  const payload = {
    fields: { name, email, message },
  };

  try {
    const res = await fetch(`https://www.lugatu.com/api/v1/forms/${process.env.LUGATU_FORM_ID}/submissions`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${process.env.LUGATU_API_KEY}`,
        'Content-Type': 'application/json',
        'Idempotency-Key': crypto.randomUUID(),
      },
      body: JSON.stringify(payload),
    });

    if (!res.ok) {
      return { success: false, error: 'Failed to submit form.' };
    }

    return { success: true, error: null };
  } catch (err) {
    return { success: false, error: 'Network error occurred.' };
  }
}

2. Komponen Formulir Sisi Klien dengan Status Pemuatan

Hubungkan Server Action Anda ke komponen klien React 19 / Next.js dengan indikator pemuatan yang dapat diakses.

components/ContactForm.tsx tsx
'use client';

import { useActionState } from 'react';
import { submitContact } from '@/app/actions/contact';

export function ContactForm() {
  const [state, formAction, isPending] = useActionState(submitContact, { success: false, error: null });

  return (
    <form action={formAction} className="space-y-4 max-w-md">
      <div>
        <label className="block text-sm font-semibold mb-1">Name</label>
        <input name="name" required className="w-full border rounded-xl p-2.5" />
      </div>
      <div>
        <label className="block text-sm font-semibold mb-1">Email</label>
        <input type="email" name="email" required className="w-full border rounded-xl p-2.5" />
      </div>
      <div>
        <label className="block text-sm font-semibold mb-1">Message</label>
        <textarea name="message" rows={4} required className="w-full border rounded-xl p-2.5" />
      </div>

      <input type="text" name="_gotcha" style={{ display: 'none' }} tabIndex={-1} autoComplete="off" />

      <button type="submit" disabled={isPending} className="btn-primary-editorial w-full py-2.5">
        {isPending ? 'Sending...' : 'Send Message'}
      </button>

      {state.success && <p className="text-emerald-700 text-sm">Thank you! Your message was received.</p>}
      {state.error && <p className="text-red-700 text-sm">{state.error}</p>}
    </form>
  );
}

Keamanan & Otentikasi Invarian

Instruksi Keamanan: Jangan pernah mengawali LUGATU_API_KEY dengan NEXT_PUBLIC_. Hanya variabel sisi server pribadi yang dapat menyimpan kunci API aktif Anda dengan aman.

Pemecahan Masalah & Kesalahan Penyerapan Umum

Permintaan kunci API mengembalikan 403 FORBIDDEN_BROWSER_ORIGIN

Anda melakukan panggilan ambil() dari kode browser sisi klien dengan kunci API. Beralih ke Tindakan Server Next.js atau gunakan titik akhir formulir publik tanpa kunci API.

Pertanyaan yang Sering Diajukan

Bisakah saya menerapkan ini ke Vercel atau Cloudflare Pages?

Ya. Tindakan Server bekerja dengan lancar di seluruh platform tanpa server dan runtime edge yang didukung oleh Next.js.

Siap membuat titik akhir formulir Anda?

Mulailah secara gratis dalam hitungan detik. Tidak diperlukan kartu kredit.

Mulai Gratis →