Implemente tratamento de erros profissional: códigos de status, mensagens customizadas, logging e estratégias de recuperação.
Experiência do Usuário: Erros bem tratados mantêm a aplicação funcionando e informam o usuário adequadamente.
Debugging: Logs estruturados facilitam identificação e correção de problemas em produção.
// 📁 server/trpc/errors.ts
import { TRPCError } from '@trpc/server';
// 🎯 Tipos de erro customizados
export class UserNotFoundError extends TRPCError {
constructor(userId: string) {
super({
code: 'NOT_FOUND',
message: 'Usuário com ID ' + userId + ' não encontrado',
cause: 'USER_NOT_FOUND'
});
}
}
export class ValidationError extends TRPCError {
constructor(field: string, message: string) {
super({
code: 'BAD_REQUEST',
message: 'Erro de validação em ' + field + ': ' + message,
cause: 'VALIDATION_ERROR'
});
}
}
// 📁 server/trpc/routers/user.ts
export const userRouter = router({
getUser: publicProcedure
.input(z.string())
.query(async ({ input, ctx }) => {
try {
// 🔍 Buscar usuário
const user = await ctx.db.user.findUnique({
where: { id: input }
});
if (!user) {
throw new UserNotFoundError(input);
}
return user;
} catch (error) {
// 📝 Log do erro
console.error('Erro ao buscar usuário:', {
userId: input,
error: error.message,
stack: error.stack
});
// 🚨 Re-throw para o cliente
throw error;
}
}),
});
Confira o exemplo interativo desta aula rodando em tempo real:
Acesse: /curso-trpc/modulo-1/aula-5/live-mode
Você agora domina os fundamentos do tRPC e está pronto para construir aplicações full-stack type-safe profissionais.