Concepto clave
Las Server Actions en SvelteKit son funciones que se ejecutan exclusivamente en el servidor, permitiendo manejar operaciones sensibles como validaciones, acceso a bases de datos o procesamiento de datos sin exponer lógica al cliente. Imagina que estás en un restaurante: el cliente (navegador) solo ve el menú y hace pedidos, pero toda la preparación de la comida (validación de ingredientes, cocción, empaque) ocurre en la cocina (servidor). Esto mejora la seguridad y el rendimiento, ya que el código del servidor nunca llega al navegador.
Para formularios, las Server Actions reemplazan el enfoque tradicional de enviar datos a una API endpoint. En lugar de eso, defines una acción en +page.server.js que SvelteKit vincula automáticamente a tu formulario. Cuando el usuario envía el formulario, los datos viajan directamente a esta acción, se procesan en el servidor y se devuelve una respuesta. Esto elimina la necesidad de escribir fetch requests manuales y reduce la latencia, ya que todo ocurre en una sola solicitud HTTP.
Cómo funciona en la práctica
Veamos el flujo paso a paso para crear un formulario de contacto con Server Actions:
- Crea un archivo
+page.sveltecon un formulario HTML estándar. Usa el atributomethod="POST"y no necesitas especificar una acción; SvelteKit lo maneja automáticamente. - En el mismo directorio, crea
+page.server.jsy exporta una función llamadaactions. Dentro, define una acción comodefaulto con un nombre específico. - En la acción, accede a los datos del formulario usando
request.formData(), valídalos y realiza operaciones como guardar en una base de datos. - Devuelve un objeto con resultados, como un mensaje de éxito o errores, que SvelteKit inyecta en la página para mostrar feedback al usuario.
Este enfoque es más eficiente que las APIs REST porque evita el viaje de ida y vuelta adicional. Por ejemplo, en una app de e-commerce, al agregar un producto al carrito, la Server Action puede actualizar la base de datos y devolver el nuevo total inmediatamente, sin recargar la página.
Código en acción
Aquí tienes un ejemplo funcional de un formulario de registro:
// +page.server.js
export const actions = {
default: async ({ request }) => {
const data = await request.formData();
const email = data.get('email');
const password = data.get('password');
// Validación básica
if (!email || !email.includes('@')) {
return { error: 'Email inválido' };
}
if (password.length < 6) {
return { error: 'La contraseña debe tener al menos 6 caracteres' };
}
// Simular guardado en base de datos
console.log(`Usuario registrado: ${email}`);
return { success: true, message: 'Registro exitoso' };
}
};
Regístrate
Email:
Contraseña:
Enviar
{#if form?.error}
{form.error}
{/if}
{#if form?.success}
{form.message}
{/if}
Antes, con un enfoque tradicional, tendrías que crear un endpoint API separado y usar fetch en el cliente. Ahora, con Server Actions, todo está encapsulado en el servidor, mejorando la seguridad y simplificando el código.
Errores comunes
- Olvidar el use:enhance en el formulario: Sin esto, la página se recarga completamente al enviar el formulario, perdiendo la interactividad de SvelteKit. Siempre inclúyelo para habilitar actualizaciones progresivas.
- No validar datos en el servidor: Aunque valides en el cliente con HTML5, siempre valida en la Server Action. Los usuarios pueden deshabilitar JavaScript o manipular solicitudes, exponiendo vulnerabilidades.
- Confundir actions con load functions: Las actions manejan envíos de formularios (POST), mientras que load carga datos iniciales (GET). Usa
+page.server.jspara ambos, pero exporta funciones separadas. - Ignorar manejo de errores: No asumas que las operaciones como guardar en BD siempre tendrán éxito. Envuelve tu código en try-catch y devuelve mensajes claros al usuario.
- Sobrecargar una acción con lógica compleja: Si una acción hace demasiado (ej., validar, procesar, enviar email), refactoriza en funciones auxiliares para mantenerla legible y testeable.
Checklist de dominio
- Puedo crear un formulario en +page.svelte que use method="POST" y use:enhance.
- Sé definir una Server Action en +page.server.js exportando un objeto actions.
- Puedo acceder y validar datos del formulario usando request.formData().
- Entiendo cómo devolver resultados (éxito/error) desde la acción y mostrarlos en la interfaz.
- Puedo diferenciar entre acciones nombradas (para múltiples formularios) y la acción default.
- Sé proteger datos sensibles manteniendo la lógica solo en el servidor.
- Puedo integrar Server Actions con una base de datos real para operaciones CRUD.
Implementa un formulario de tareas con Server Actions
Crea una aplicación simple de lista de tareas donde los usuarios puedan agregar nuevas tareas usando Server Actions. Sigue estos pasos:
- Configura un nuevo proyecto SvelteKit si no tienes uno:
npm create svelte@latest my-todo-app. - En la página principal (
src/routes/+page.svelte), crea un formulario con un campo de texto para la descripción de la tarea y un botón de enviar. Usamethod="POST"yuse:enhance. - En
+page.server.js, exporta una acción default que:- Reciba los datos del formulario.
- Valide que la descripción no esté vacía y tenga al menos 3 caracteres.
- Simule guardar la tarea en un array en memoria (usa una variable let fuera de la acción).
- Devuelva un objeto con
success: truey la lista actualizada de tareas.
- En la misma página, muestra la lista de tareas debajo del formulario. Usa la propiedad
formpara acceder a los datos devueltos por la acción. - Agrega un mensaje de error si la validación falla, y un mensaje de éxito cuando se agregue una tarea.
- Opcional: Añade un botón para marcar tareas como completadas, usando otra acción nombrada en
+page.server.js.
- Recuerda que la variable en memoria se reseteará al recargar la página; en un caso real, usarías una base de datos.
- Usa
export let form;en el script de +page.svelte para acceder a los resultados de la acción. - Para acciones nombradas, define un nombre como
addTasken el objeto actions y usaform?.['addTask']en el frontend.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.