Lección 14 de 17 · Lectura y práctica
Desarrollo de funcionalidades con Server Actions
Concepto claveLas Server Actions en Next.js 15 son funciones que se ejecutan exclusivamente en el servidor, permitiendo realizar operaciones seguras como mutaciones de datos, sin necesidad de crear rutas API manuales. Piensa en.
Del concepto a la práctica
Taller de esta lección
En el proyecto integrador, una funcionalidad útil combina formulario, acción, validación y actualización visible. Registraremos una revisión para un artículo identificado por slug. La acción debe comprobar que el artículo existe antes de aceptar el comentario; de lo contrario, una entrada válida podría apuntar a un recurso inexistente.
Ejemplo resuelto
'use server'
const articles = ['rutas-claras']
export async function addReview(formData: FormData) {
const slug = String(formData.get('slug') ?? '')
const text = String(formData.get('text') ?? '').trim()
if (!articles.includes(slug) || text.length < 5) return { ok: false, error: 'Revisión no válida' }
return { ok: true, slug, text }
}rutas-claras con Muy útil devuelve éxito.
Pruébalo
Presenta el slug como campo del formulario.
Valida existencia y longitud en servidor.
Prueba un slug desconocido.
Muestra el resultado sin borrar el texto válido por accidente.
Comprueba tu resultado
Error frecuente: actualizar la interfaz antes de saber si la acción terminó bien. Corrígelo esperando el resultado y tratando ok: false. Resultado esperado: solo el slug conocido con texto de cinco o más caracteres devuelve datos validados; aún no se guarda una revisión.
De validar a guardar
No presentes el return del ejemplo como una escritura. En la acción final lee campos string, consulta la sesión, verifica acceso al artículo y guarda la revisión con un ID y fecha en el backend duradero. Solo después de confirmar la transacción llama revalidatePath('/articulos/' + slug) y devuelve el ID creado. Usa useActionState para pintar éxito y error, y no borres el texto del formulario en una denegación. Dos envíos equivalentes pueden crear dos registros si no defines una clave de operación única: deshabilitar el botón reduce dobles clics, no sustituye la idempotencia en servidor.

Mapa de prácticaEl servidor puede obtener datos y producir el HTML inicial. El navegador muestra el resultado y ejecuta las interacciones que necesitan estado local. Mantén las claves sensibles en el servidor y define qué parte se ejecuta en cada entorno.
Ver la infografía en tamaño completo ↗Fuentes para profundizar
Concepto clave
Las Server Actions en Next.js 15 son funciones que se ejecutan exclusivamente en el servidor, permitiendo realizar operaciones seguras como mutaciones de datos, sin necesidad de crear rutas API manuales. Piensa en ellas como "atajos" que conectan directamente tu interfaz de usuario con la lógica del servidor, similar a cómo un formulario web tradicional envía datos a un endpoint, pero con la potencia de React y TypeScript.
Estas acciones se definen con 'use server' y pueden ser invocadas desde componentes cliente mediante eventos como onSubmit. La clave es que nunca se envían al cliente, manteniendo credenciales o lógica sensible seguras. Una analogía del mundo real: imagina un restaurante donde los comensales (cliente) solo ven el menú y hacen pedidos, mientras la cocina (servidor) prepara la comida con ingredientes y recetas que nunca salen a la sala.
Cómo funciona en la práctica
Para implementar una Server Action, sigue estos pasos en un proyecto Next.js 15 con App Router:
- Crea un archivo
actions.tsen tu proyecto y define una función asíncrona con'use server'al inicio. - Exporta la función para usarla en componentes. Por ejemplo, una acción para agregar un usuario:
// actions.ts
export async function addUser(formData: FormData) {
'use server';
const name = formData.get('name') as string;
// Lógica para guardar en base de datos
console.log(`Usuario ${name} agregado`);
}- En un componente cliente, importa la acción y úsala en un formulario:
// app/page.tsx
import { addUser } from '@/actions';
export default function Home() {
return (
);
}Al enviar el formulario, Next.js maneja la solicitud en el servidor, ejecuta addUser, y puede redirigir o actualizar la UI sin recargar la página completa.
Caso de estudio
Desarrollaremos una funcionalidad para una aplicación de tareas (todo-list) que permite agregar nuevas tareas usando Server Actions. Supongamos que tenemos una base de datos PostgreSQL y queremos evitar crear una ruta API separada.
| Paso | Acción | Descripción |
|---|---|---|
| 1 | Definir acción | Crear actions/todo.ts con una función createTodo que valide datos y los inserte en la DB. |
| 2 | Integrar en UI | En un componente TodoForm, usar action={createTodo} en un formulario con campos para título y descripción. |
| 3 | Manejar estado | Usar useTransition de React para mostrar un estado de carga mientras se ejecuta la acción. |
| 4 | Validar en servidor | En createTodo, verificar que el título no esté vacío y retornar errores si es necesario. |
Dato importante: Server Actions en Next.js 15 soportan Streaming SSR, permitiendo actualizar partes de la página sin bloquear la experiencia del usuario, ideal para aplicaciones interactivas.
Errores comunes
- Olvidar 'use server': Si no incluyes esta directiva, la función se ejecutará en el cliente, exponiendo lógica sensible. Siempre verifica que esté al inicio de la función.
- No validar datos en el servidor: Aunque valides en el cliente, los datos pueden ser manipulados. Usa bibliotecas como Zod en la acción para validaciones robustas.
- Ignorar manejo de errores: Las acciones deben capturar excepciones y retornar mensajes claros. Por ejemplo, usa try-catch para errores de base de datos.
- Abusar de acciones para consultas: Server Actions son para mutaciones (POST, PUT, DELETE). Para datos de solo lectura, usa Server Components o fetching estándar.
- No optimizar rendimiento: Acciones grandes o lentas pueden bloquear la UI. Divide lógica compleja y usa técnicas como debouncing en formularios.
Checklist de dominio
- Puedo definir una Server Action con
'use server'en un archivo separado o dentro de un componente. - Sé invocar una Server Action desde un formulario en un componente cliente usando el prop
action. - Implemento validación de datos tanto en cliente como en servidor para seguridad.
- Uso
useTransitiono estados para manejar carga y retroalimentación durante la ejecución. - Integro Server Actions con una base de datos real (ej., PostgreSQL o MongoDB) para operaciones CRUD.
- Manejo errores en acciones retornando objetos con mensajes que la UI puede mostrar.
- Comprendo cuándo usar Server Actions vs. rutas API tradicionales en Next.js.
Implementar un sistema de comentarios con Server Actions
En este ejercicio, crearás una funcionalidad para agregar comentarios a una publicación en una aplicación de blog usando Server Actions. Sigue estos pasos:
- Configura un proyecto Next.js 15 con App Router si no lo tienes, y asegúrate de tener una base de datos simulada (puedes usar un array en memoria para simplicidad).
- Crea un archivo
app/actions/comment.tsy define una Server Action llamadaaddCommentque:- Acepte un
FormDatacon campos parapostId(número),author(string), ycontent(string). - Valide que
contentno esté vacío y tenga al menos 10 caracteres. - Simule guardar el comentario en un array (ej.,
comments.push(...)) y retorne un objeto con éxito o error.
- Acepte un
- En
app/posts/[id]/page.tsx, crea un componente que muestre una lista de comentarios y un formulario para agregar nuevos:- Usa
action={addComment}en el formulario, con campos ocultos parapostId. - Implementa
useTransitionpara mostrar un spinner mientras se envía el comentario. - Después de enviar, actualiza la lista de comentarios sin recargar la página (puedes usar revalidación o estado local).
- Usa
- Prueba la funcionalidad agregando comentarios y verificando que se muestren en la UI y que las validaciones funcionen.
Pistas
- Recuerda que 'use server' debe estar al inicio de la función en actions/comment.ts.
- Usa
useStateyuseEffectpara manejar la lista de comentarios en el componente, o considera usar Server Components para datos iniciales. - Para simular una base de datos, declara un array fuera de la acción (ej.,
let comments = []), pero en un caso real usarías una DB como PostgreSQL.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Next.js 15: Aplicaciones Full-Stack con Server Components y Streaming SSR
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.