🔧 Troubleshooting
Problemas Comunes y Soluciones
Desarrollo
Error: "Cannot find module '@/core/db'"
Causa: Path alias no configurado
Solución:
- Verifica
tsconfig.json:{
"compilerOptions": {
"paths": {
"@/*": ["./src/*"]
}
}
} - Reinicia el servidor TypeScript en tu IDE
- Ejecuta
pnpm type-checkpara verificar
Error: "Prisma Client not generated"
Causa: Prisma Client no generado después de cambios en schema
Solución:
pnpm db:generate
Error: "Module not found" en tests
Causa: Vitest no encuentra módulos con path aliases
Solución:
- Verifica
vitest.config.ts:resolve: {
alias: {
'@': path.resolve(__dirname, './src'),
},
} - Reinicia los tests
Base de Datos
Error: "Unique constraint failed"
Causa: Intento de crear registro duplicado
Solución:
- Verifica que no existe el registro:
const existing = await db.model.findUnique({
where: { uniqueField: value },
}); - Usa
upserten lugar decreatesi es apropiado
Error: "Foreign key constraint failed"
Causa: Referencia a registro inexistente
Solución:
- Verifica que el registro referenciado existe
- Verifica el orden de creación (crear dependencias primero)
Error: "Connection timeout"
Causa: Base de datos no accesible o credenciales incorrectas
Solución:
- Verifica
DATABASE_URLen.env.local - Verifica que Supabase está activo
- Verifica firewall/red
Autenticación (Clerk)
Error: "Unauthorized" en Server Actions
Causa: Usuario no autenticado o sin permisos
Solución:
- Verifica que el usuario está autenticado:
const user = await getCurrentUser();
if (!user) throw new Error('Unauthorized'); - Verifica RBAC:
requireRole(user, ['ORGANIZER', 'ADMIN']);
Error: "Clerk user not found"
Causa: Profile no sincronizado con Clerk
Solución:
- Verifica que el webhook de Clerk está configurado
- Crea el profile manualmente si es necesario:
await db.profile.create({
data: {
userId: clerkUserId,
email: email,
name: name,
role: 'PARTICIPANT',
},
});
Supabase Realtime
Error: "Supabase Realtime no configurado"
Causa: Variables de entorno faltantes
Solución:
- Verifica
.env.local:NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx - Reinicia el servidor
Error: "No se puede suscribir al canal"
Causa: RLS bloqueando o Realtime no habilitado
Solución:
- Habilita Realtime en Supabase Dashboard → Database → Replication
- Verifica políticas RLS
- Verifica que el usuario está autenticado
No se actualiza automáticamente
Causa: Realtime no configurado correctamente
Solución:
- Verifica conexión WebSocket en DevTools
- Verifica que Realtime está habilitado
- Revisa consola para errores
Server Actions
Error: "FormData is not defined"
Causa: Server Action ejecutándose en cliente
Solución:
- Verifica que el archivo tiene
'use server'al inicio - Verifica que estás llamando desde un componente del servidor o con
formAction
Error: "revalidatePath is not a function"
Causa: Import incorrecto
Solución:
import { revalidatePath } from 'next/cache';
Validaciones
Error: "Zod validation failed"
Causa: Datos no cumplen schema
Solución:
- Revisa el error de Zod para ver qué campo falla
- Verifica tipos de datos (dates, numbers, etc.)
- Usa
.parse()con try-catch para mejor debugging:try {
const validated = schema.parse(data);
} catch (error) {
if (error instanceof z.ZodError) {
console.error(error.errors);
}
}
Build y Deploy
Error: "Build failed" en Vercel
Causa: Variables de entorno faltantes o errores de TypeScript
Solución:
- Verifica variables de entorno en Vercel Dashboard
- Ejecuta
pnpm buildlocalmente para reproducir - Verifica logs de build en Vercel
Error: "Cron job not running"
Causa: Configuración incorrecta en vercel.json
Solución:
- Verifica
vercel.json:{
"crons": [{
"path": "/api/cron/update-hackathon-states",
"schedule": "* * * * *"
}]
} - Verifica que la ruta existe y retorna 200
- Verifica
CRON_SECRETen variables de entorno
Performance
Aplicación lenta
Causa: Queries N+1 o falta de índices
Solución:
- Usa
includepara cargar relaciones:await db.hackathon.findMany({
include: {
criteria: true,
judges: true,
},
}); - Agrega índices en Prisma schema:
model Hackathon {
@@index([status])
@@index([organizerId])
}
Tests lentos
Causa: Tests usando DB real o mocks ineficientes
Solución:
- Usa mocks en lugar de DB real
- Limpia datos eficientemente
- Usa
beforeAllpara setup costoso
Debugging Tips
1. Logs Detallados
console.log('[DEBUG]', {
userId: user?.profile.id,
hackathonId: hackathonId,
data: data,
});
2. Sentry Integration
Los errores se capturan automáticamente con Sentry:
import { captureError } from '@/core/errors';
try {
// código
} catch (error) {
captureError(error, {
context: 'functionName',
userId: user?.profile.id,
});
}
3. Prisma Studio
Inspecciona la base de datos:
pnpm db:studio
4. Network Tab
Revisa requests en DevTools → Network:
- Server Actions
- API Routes
- WebSocket connections
5. React DevTools
Inspecciona estado de componentes:
- Props
- State
- Hooks
Recursos
Siguiente: Testing Guide