Integrácia backendu formulára Next.js (smerovač aplikácií a akcie servera)
Vyplňte príručku implementácie TypeScript a React na spracovanie kontaktných formulárov v Next.js 14/15 pomocou koncových bodov Lugatu a akcií servera s nulovým vystavením povereniam.
1. Architektúra smerovača aplikácie Next.js s akciami servera
Akcie servera Next.js sa vykonávajú výlučne na serveri, vďaka čomu sú ideálne na odosielanie dopytov pomocou súkromných kľúčov API Lugatu bez odhalenia tajomstiev v balíkoch klientov.
'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. Komponent formulára na strane klienta so stavom načítania
Pripojte svoju Server Action ku klientskemu komponentu React 19 / Next.js s dostupnými indikátormi načítania.
'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>
);
}
Bezpečnosť a nemenné overenie
Bezpečnostné pokyny: Nikdy pred LUGATU_API_KEY predponu NEXT_PUBLIC_. Iba súkromné premenné na strane servera môžu bezpečne uchovávať váš živý kľúč API.
Riešenie problémov a bežné chyby príjmu
Uskutočňujete volanie fetch() z kódu prehliadača na strane klienta pomocou kľúča API. Prepnite na akciu servera Next.js alebo použite verejný koncový bod formulára bez kľúča API.
Často kladené otázky
Môžem to nasadiť na Vercel alebo Cloudflare Pages?
áno. Server Actions fungujú bez problémov naprieč platformami bez serverov a okrajovými runtimemi podporovanými Next.js.
Ste pripravení vytvoriť koncový bod formulára?
Začnite zadarmo za pár sekúnd. Nevyžaduje sa žiadna kreditná karta.