Home / Mga gabay / Next.js Form Backend Integration (App Router at Server Actions)
GABAY SA PAGSASAMA · FRONTEND & NEXT.JS

Next.js Form Backend Integration (App Router at Server Actions)

Kumpletuhin ang gabay sa pagpapatupad ng TypeScript at React para sa paghawak ng mga contact form sa Next.js 14/15 gamit ang mga endpoint ng Lugatu at Mga Pagkilos ng Server na walang pagkakalantad ng kredensyal.

1. Next.js App Router Architecture na may Server Actions

Ang Next.js Server Actions ay eksklusibong isinasagawa sa server, na ginagawang perpekto ang mga ito para sa pagsusumite ng mga katanungan gamit ang mga pribadong Lugatu API key nang hindi naglalantad ng mga lihim sa mga bundle ng kliyente.

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. Client-Side Form Component na may Loading State

Ikonekta ang iyong Pagkilos sa Server sa isang React 19 / Next.js na bahagi ng kliyente na may naa-access na mga indicator ng paglo-load.

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>
  );
}

Invariant ng Seguridad at Pagpapatotoo

Tagubilin sa Seguridad: Huwag kailanman i-prefix ang LUGATU_API_KEY sa NEXT_PUBLIC_. Ang mga pribadong variable sa gilid ng server lang ang maaaring ligtas na humawak sa iyong live na API key.

Pag-troubleshoot at Mga Karaniwang Error sa Pag-ingest

Ang kahilingan sa API key ay nagbabalik ng 403 FORBIDDEN_BROWSER_ORIGIN

Gumagawa ka ng fetch() na tawag mula sa client-side browser code na may API key. Alinman sa lumipat sa isang Next.js Server Action o gamitin ang public form na endpoint nang walang API key.

Mga Madalas Itanong

Maaari ko bang i-deploy ito sa Vercel o Cloudflare Pages?

Oo. Ang Mga Pagkilos ng Server ay walang putol na gumagana sa mga walang server na platform at edge runtime na sinusuportahan ng Next.js.

Handa nang gawin ang endpoint ng iyong form?

Magsimula nang libre sa ilang segundo. Walang kinakailangang credit card.

Magsimula nang Libre →