Lección 8 de 20 · Lectura y práctica
Maneja validaciones y errores en Server Actions
Tipo de lección: VideoConcepto claveLas validaciones y manejo de errores en Server Actions son el sistema de defensa de tu aplicación. Imagina que estás construyendo un formulario de registro: sin validaciones, los usuarios.
Del concepto a la práctica
Taller de esta lección
Validar no es únicamente comprobar que exista un valor: es definir límites y distinguir un dato rechazable de un fallo inesperado. Para una tarea, puedes limitar el título a entre 3 y 80 caracteres y devolver errores por campo. Si el almacenamiento falla, no muestres detalles internos; devuelve un mensaje general y registra el contexto de forma segura.
Ejemplo resuelto
Las entradas “Ok”, “Preparar la demo” y una cadena de 81 caracteres producen, respectivamente, error de longitud, aceptación y error de límite. La regla es determinista: contar caracteres después de recortar espacios.
Genera la entrada larga con "a".repeat(81), para evitar contar a mano. typeof raw debe ser string: FormData también admite archivos. El límite de este fixture mide unidades UTF-16 con title.length, no grafemas visibles; todos sus casos usan ASCII. Devuelve fail(400,{error:"Título entre3 y80"}) para el rechazo, no un200 que el cliente interpretará como success; registra fallos de almacenamiento con un código seguro sin copiar el formulario ni secretos.
Pruébalo
Recorta el título antes de validarlo.
Rechaza longitud menor que 3.
Rechaza longitud mayor que 80.
Devuelve un objeto con error específico sin lanzar la excepción de validación.
Comprueba tu resultado
Error frecuente: devolver siempre “algo salió mal”; corrígelo separando errores de entrada y errores del servidor.
Ejercicio: prueba exactamente los tres títulos indicados. Resultado esperado: “Ok” se rechaza, “Preparar la demo” se acepta y la cadena de 81 caracteres se rechaza por superar el límite.

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 ↗Tipo de lección: Video
Concepto clave
Las validaciones y manejo de errores en Server Actions son el sistema de defensa de tu aplicación. Imagina que estás construyendo un formulario de registro: sin validaciones, los usuarios podrían enviar emails inválidos o contraseñas vacías, corrompiendo tu base de datos. Las validaciones actúan como un filtro que solo permite datos limpios y estructurados, mientras que el manejo de errores es el plan de contingencia cuando algo falla.
En SvelteKit, las Server Actions se ejecutan en el servidor, lo que significa que puedes validar datos antes de procesarlos, sin exponer lógica sensible al cliente. Esto es crucial para seguridad y consistencia. Piensa en ello como un control de calidad en una fábrica: cada producto (dato) pasa por inspección antes de ser empaquetado (almacenado).
Cómo funciona en la práctica
El flujo típico sigue estos pasos: 1) El cliente envía datos a través de un formulario, 2) La Server Action recibe los datos en el servidor, 3) Se ejecutan validaciones (ej., formato de email, longitud de contraseña), 4) Si hay errores, se devuelven al cliente con mensajes claros, 5) Si todo es válido, se procesa la acción (ej., guardar en base de datos).
Veamos un ejemplo básico: validar un formulario de contacto. Primero, definimos esquemas de validación usando librerías como Zod o validaciones manuales. Luego, en la acción, verificamos cada campo. Si falla, retornamos un objeto de errores que SvelteKit puede mostrar en el frontend. Este enfoque mantiene la lógica centralizada y evita duplicación.
Código en acción
Aquí tienes un ejemplo funcional con validaciones usando Zod:
// +page.server.js - Server Action con validaciones
import { z } from 'zod';
import { fail } from '@sveltejs/kit';
// Esquema de validación para un formulario de registro
const registerSchema = z.object({
email: z.string().email('Email inválido'),
password: z.string().min(8, 'La contraseña debe tener al menos 8 caracteres'),
name: z.string().min(2, 'El nombre debe tener al menos 2 caracteres')
});
export const actions = {
register: async ({ request }) => {
const formData = await request.formData();
const data = Object.fromEntries(formData);
// Validar datos
const result = registerSchema.safeParse(data);
if (!result.success) {
// Devolver errores de validación
const errors = result.error.errors.reduce((acc, err) => {
acc[err.path[0]] = err.message;
return acc;
}, {});
return fail(400, { errors, data });
}
// Procesar datos válidos (ej., guardar en base de datos)
console.log('Datos válidos:', result.data);
return { success: true };
}
};Y en el frontend, manejamos los errores:
<!-- +page.svelte -->
<script>
import { enhance } from '$app/forms';
import { page } from '$app/stores';
</script>
<form method="POST" action="?/register" use:enhance>
<label>Email:</label>
<input type="email" name="email" value={$page.form?.data?.email || ''} />
{#if $page.form?.errors?.email}
<p style="color: red;">{$page.form.errors.email}</p>
{/if}
<label>Contraseña:</label>
<input type="password" name="password" />
{#if $page.form?.errors?.password}
<p style="color: red;">{$page.form.errors.password}</p>
{/if}
<button type="submit">Registrarse</button>
</form>Errores comunes
- Validar solo en el cliente: Los usuarios pueden deshabilitar JavaScript o manipular requests, exponiendo tu aplicación a datos maliciosos. Solución: Siempre valida en el servidor con Server Actions, usando el cliente solo para mejor UX.
- Mensajes de error genéricos: Devolver "Error 500" o "Algo salió mal" no ayuda al usuario a corregir problemas. Solución: Proporciona mensajes específicos, como "El email ya está registrado" o "La contraseña es demasiado corta".
- No manejar excepciones de base de datos: Asumir que las operaciones de BD siempre tienen éxito puede crashear tu app. Solución: Envuelve llamadas a BD en try-catch y devuelve errores amigables.
- Olvidar limpiar datos antiguos: Al recargar una página con errores, los campos pueden mostrar valores incorrectos. Solución: Usa
$page.form?.datapara rellenar formularios y resetear después del éxito.
Checklist de dominio
- ¿Implementas validaciones tanto en cliente (para UX) como en servidor (para seguridad)?
- ¿Usas esquemas de validación (ej., Zod) para mantener consistencia y reutilización?
- ¿Devuelves mensajes de error específicos y accionables para cada campo fallido?
- ¿Manejas excepciones inesperadas (ej., fallos de BD) con try-catch en Server Actions?
- ¿Proteges contra ataques comunes como inyección SQL o XSS al validar y sanitizar datos?
- ¿Testeas validaciones con casos límite (ej., strings vacíos, caracteres especiales)?
- ¿Documentas los códigos de error y flujos de validación para tu equipo?
Implementa validaciones y manejo de errores en un formulario de tareas
En este ejercicio, mejorarás un formulario de tareas existente agregando validaciones robustas y manejo de errores. Sigue estos pasos:
- Configura el proyecto: Crea un nuevo proyecto SvelteKit o usa uno existente. Asegúrate de tener Zod instalado (
npm install zod). - Crea el esquema de validación: En
+page.server.js, define un esquema Zod para una tarea con campos: título (requerido, mínimo 3 caracteres), descripción (opcional, máximo 500 caracteres), y fecha límite (requerida, debe ser futura). - Implementa la Server Action: Modifica la acción existente o crea una nueva (
createTask) que valide los datos del formulario usando el esquema. Si hay errores, devuélvelos confail(400, { errors, data }). Si es válido, simula guardar en una variable en memoria y retorna éxito. - Actualiza el frontend: En
+page.svelte$page.form?.errors. Asegúrate de que los campos mantengan sus valores tras un error. - Agrega manejo de excepciones: Envuelve la lógica de "guardado" en un try-catch. Si ocurre un error inesperado (ej., simula lanzando un error), devuelve un mensaje general amigable.
- Prueba tu implementación: Envía el formulario con datos inválidos y verifica que los errores se muestren. Luego, con datos válidos, confirma que se procesa correctamente.
Pistas
- Usa
z.date().min(new Date())en Zod para validar fechas futuras. - Recuerda que
fail()de SvelteKit es clave para devolver errores al frontend sin crashear. - Para simular un error inesperado, puedes agregar
if (Math.random() > 0.8) throw new Error('Error de BD simulado');en la acción.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con SvelteKit Full-Stack: Construye Aplicaciones Web Performantes con Server Actions
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.