Next.js desde Cero (App Router)

Server Actions: forms sin API extra

Server Actions: formularios sin API extra Las Server Actions son funciones que se ejecutan en el servidor pero que puedes invocar directamente desde un formulario o un evento del cliente, sin crear endpoints de API a mano. Se marcan con la directiva "use server" y son la forma moderna de mutar datos en el App Router: el formulario envía, la función valida y escribe en la base de datos, y luego refrescas la UI. Anatomía de una Server Action // app/tareas/actions.ts "use server"; import { z } from
Tiempo de estudio
18 Min

Server Actions: formularios sin API extra


Las Server Actions son funciones que se ejecutan en el servidor pero que puedes invocar directamente desde un formulario o un evento del cliente, sin crear endpoints de API a mano. Se marcan con la directiva "use server" y son la forma moderna de mutar datos en el App Router: el formulario envía, la función valida y escribe en la base de datos, y luego refrescas la UI.



Anatomía de una Server Action


// app/tareas/actions.ts
"use server";
import { z } from "zod";
import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";

const schema = z.object({
titulo: z.string().min(1, "El título es obligatorio"),
});

export async function crearTarea(formData: FormData) {
const parsed = schema.safeParse({
titulo: formData.get("titulo"),
});

if (!parsed.success) {
return { error: parsed.error.flatten().fieldErrors };
}

await db.tarea.create({ data: parsed.data });
revalidatePath("/tareas"); // refresca la lista
redirect("/tareas");
}


Conectarla a un formulario


Pasa la acción al atributo action del formulario. No necesitas onSubmit ni fetch:


// app/tareas/page.tsx (Server Component)
import { crearTarea } from "./actions";

export default function Page() {
return (
<form action={crearTarea}>
<input name="titulo" placeholder="Nueva tarea" />
<button type="submit">Crear</button>
</form>
);
}


Atención

Nunca confíes en los datos del formulario. Valida siempre en el servidor (aquí con Zod) antes de escribir en la base de datos. La validación del navegador es solo una conveniencia para el usuario, no una barrera de seguridad.



¿Qué hace revalidatePath?

Invalida la cache de la ruta indicada para que la próxima vez que se visite muestre los datos actualizados. Sin él, podrías crear una tarea y no verla hasta recargar manualmente.



¿Dónde debes validar los datos de un formulario que crea registros?

La validación de servidor es la única que no puede saltarse un usuario malicioso. La del navegador mejora la experiencia pero no protege la base de datos.


Ejercicio práctico


Objetivo: crear un formulario funcional con Server Action y validación.

  1. Crea un esquema con Zod para un recurso simple (por ejemplo un comentario con texto mínimo de 3 caracteres).
  2. Escribe una Server Action con "use server" que valide con safeParse.
  3. Si la validación falla, devuelve los errores; si pasa, escribe en la DB y llama a revalidatePath.
  4. Conecta la acción al atributo action de un <form> y prueba enviar datos válidos e inválidos.

Entregable: captura del formulario rechazando un envío inválido y aceptando uno válido.



Para recordar

  • Las Server Actions ("use server") mutan datos sin endpoints manuales.
  • Patrón: validar (Zod) → escribir DB → revalidatePathredirect.
  • La validación de servidor es obligatoria; la del cliente es solo comodidad.
Texto Leccion 2/12
Estas viendo
Server Actions: forms sin API extra
Hablar por WhatsAppContactar por WhatsApp