đ Server Actions dans Next.js 13+ : Le Remplacement des API Routes
Avec lâintroduction de Server Actions dans Next.js 13+, on assiste Ă un changement majeur dans la gestion des actions cĂŽtĂ© serveur, remplaçant progressivement les API Routes.
1ïžâŁ Quâest-ce quâune Server Action ?
Les Server Actions permettent dâexĂ©cuter des fonctions cĂŽtĂ© serveur directement depuis les composants React sans avoir besoin de crĂ©er une route API distincte.
â Avantages :
- Plus besoin de définir des API Routes (
pages/api/*
ouapp/api/*
). - RĂ©duction des allers-retours client-serveur.
- Sécurité renforcée : les actions ne sont pas exposées cÎté client.
- Simplicité et meilleure lisibilité du code.
đč Comparaison :
API Routes (app/api/* ) | Server Actions (use server ) |
---|---|
Nécessite une route séparée (app/api/... ) | Directement définie dans les composants |
Requiert un appel fetch cĂŽtĂ© client | Peut ĂȘtre appelĂ©e comme une fonction normale |
Doit gĂ©rer la validation et lâĂ©tat cĂŽtĂ© client | GĂšre tout sur le serveur automatiquement |
Voici une version amĂ©liorĂ©e du chapitre, mettant en parallĂšle une API Route classique et une Server Action, afin dâillustrer clairement leurs diffĂ©rences.
2ïžâŁ MĂ©thode avec une API Route (app/api/
)
DĂ©finition de lâAPI Route
Avec Next.js, une API Route est définie dans app/api/addComment/route.ts
ou pages/api/addComment.ts
.
import { NextResponse } from "next/server";
import { db } from "@/lib/db"; // Connexion à la base de données
export async function POST(req: Request) {
const { comment } = await req.json();
if (!comment) {
return NextResponse.json({ error: "Le commentaire est vide." }, { status: 400 });
}
await db.comments.create({ data: { content: comment } });
return NextResponse.json({ success: true });
}
Utilisation cÎté client (fetch()
)
Le client doit envoyer une requĂȘte HTTP vers lâAPI.
"use client";
import { useState } from "react";
export default function CommentsPage() {
const [comment, setComment] = useState("");
const [status, setStatus] = useState("");
async function submitComment(e: React.FormEvent) {
e.preventDefault();
setStatus("Envoi en cours...");
const response = await fetch("/api/addComment", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ comment }),
});
if (response.ok) {
setStatus("Commentaire ajouté !");
setComment("");
} else {
setStatus("Erreur lors de l'envoi.");
}
}
return (
<div>
<h1>Ajouter un commentaire</h1>
<form onSubmit={submitComment}>
<textarea
name="comment"
value={comment}
onChange={(e) => setComment(e.target.value)}
/>
<button type="submit">Envoyer</button>
</form>
<p>{status}</p>
</div>
);
}
â Points Ă retenir :
- Nécessite un appel fetch() cÎté client.
- Une requĂȘte HTTP est envoyĂ©e au serveur.
- LâAPI Route reste accessible publiquement si elle nâest pas protĂ©gĂ©e.
3ïžâŁ ExĂ©cution sans fetch
(Appels directs)
Dans un formulaire sans Ă©tat client, on peut directement passer la Server Action dans action={maFonction}
.
đč Exemple : Formulaire dâinscription
import { registerUser } from "@/app/actions/register";
export default function SignupPage() {
return (
<form action={registerUser}>
<input type="text" name="name" placeholder="Nom" required />
<input type="email" name="email" placeholder="Email" required />
<button type="submit">S'inscrire</button>
</form>
);
}
"use server";
import { db } from "@/lib/db";
export async function registerUser(formData: FormData) {
const name = formData.get("name") as string;
const email = formData.get("email") as string;
await db.user.create({
data: { name, email },
});
return { success: true };
}
â Avantages :
- Plus besoin de
fetch()
. - Exécution optimisée cÎté serveur.
- Simplicité de gestion pour les formulaires.
4ïžâŁ Server Actions avec Authentification et SĂ©curitĂ©
Les Server Actions permettent aussi dâinteragir avec lâauthentification.
đč Exemple : Authentification avec NextAuth
"use server";
import { auth } from "@/lib/auth"; // NextAuth
export async function loginUser(formData: FormData) {
const email = formData.get("email");
const password = formData.get("password");
const user = await auth.verify(email, password);
if (!user) return { error: "Identifiants incorrects" };
return { success: true, user };
}
â SĂ©curitĂ© renforcĂ©e :
- Lâauthentification reste cĂŽtĂ© serveur.
- Pas dâexposition des donnĂ©es sensibles.
5ïžâŁ Comparaison avec les API Routes
Fonctionnalité | Server Actions (use server ) | API Routes (app/api/* ) |
---|---|---|
đĄ Mode dâappel | Directement dans le composant | Via un fetch() |
đ SĂ©curitĂ© | Code non exposĂ© au client | Besoin dâune protection manuelle |
⥠Performance | Moins de requĂȘtes rĂ©seau | NĂ©cessite un appel HTTP |
đïž SimplicitĂ© | Ăcriture plus compacte | NĂ©cessite plus de code |
đ RequĂȘtes complexes (Webhooks, APIs tierces) | â Pas recommandĂ© | â AdaptĂ© |
6ïžâŁ Quand utiliser Server Actions vs API Routes ?
â Utiliser les Server Actions quand :
- Vous avez une interaction directe avec le serveur.
- Vous traitez des formulaires simples (inscription, commentaire, contactâŠ).
- Vous voulez optimiser les requĂȘtes et Ă©viter un aller-retour client-serveur.
â Utiliser les API Routes quand :
- Vous avez besoin dâune API publique pour dâautres services.
- Vous traitez des webhooks ou des requĂȘtes externes.
- Vous devez gérer des authentifications OAuth ou JWT complexes.
đŻ Conclusion : Pourquoi adopter les Server Actions ?
đ Les Server Actions simplifient lâinteraction client-serveur en Ă©vitant des API Routes superflues.
â Avantages principaux :
- Meilleure performance : moins de requĂȘtes HTTP.
- Code plus clair et plus sécurisé.
- IntĂ©gration facile avec les formulaires et lâauthentification.