Next.js Formulare mit Server Actions & App Router | Lugatu
Erstellen Sie schnelle, typsichere Formulare in Next.js mit modernen Server Actions. Übermitteln Sie Anfragen direkt an Lugatu mit vollständiger TypeScript-Unterstützung.
1. Next.js Formular-Architektur: Client vs. Server
Next.js App Router ermöglicht sowohl direkte clientseitige Übermittlungen als auch serverseitige Verarbeitung mit Server Actions. Server Actions halten API-Schlüssel vollständig geheim.
'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-Komponenten mit öffentlichem Endpunkt
Für einfache Kontaktformulare genügt eine React Client Component ("use client"), die Daten direkt an die öffentliche Formular-URL postet.
'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>
);
}
Sicherheits- und Authentifizierungsinvariante
Umgebungsvariablen-Sicherheit: Vergeben Sie für programmatische API-Schlüssel niemals das Präfix NEXT_PUBLIC_. Verwenden Sie LUGATU_API_KEY ausschließlich auf dem Server.
Fehlerbehebung und häufige Aufnahmefehler
Stellen Sie sicher, dass LUGATU_FORM_ID und LUGATU_API_KEY in Ihrer .env.local sowie in den Vercel/Hosting-Umgebungsvariablen definiert sind.
Häufig gestellte Fragen
Wird Next.js 14 und 15 mit App Router unterstützt?
Ja. Lugatu ist vollständig kompatibel mit Next.js App Router, Server Actions, Route Handlers und Pages Router.
Sind Sie bereit, Ihren Formularendpunkt zu erstellen?
Starten Sie in Sekundenschnelle kostenlos. Keine Kreditkarte erforderlich.