400: Bad Request
BadRequestException / InvalidBodyScheme
En Fang JS, no necesitas enviar respuestas de error manualmente dentro de un try/catch en cada ruta. El framework proporciona un sistema de excepciones que, al ser lanzadas, son capturadas automáticamente por el motor de Fang para enviar la respuesta HTTP adecuada.
HttpExceptionTodas las excepciones de Fang heredan de HttpException. Esta clase extiende el objeto Error nativo de JavaScript, pero añade soporte para códigos de estado HTTP y captura de traza (stack trace).
import { HttpException } from "@fang-js/fang/exceptions";
// Puedes lanzar una excepción genéricathrow new HttpException("Mensaje personalizado", 418);Fang incluye las excepciones más comunes para que tu código sea más semántico y legible:
400: Bad Request
BadRequestException / InvalidBodyScheme
401: Unauthorized
UnauthorizedException
403: Forbidden
ForbiddenException
404: Not Found
NotFoundException
405: Method Not Allowed
MethodNotAllowedException
409: Conflict
ConflictException
422: Unprocessable Entity
UnprocessableEntityException
429: Too Many Requests
TooManyRequestsException
500: Internal Error
InternalServerErrorException
502: Bad Gateway
BadGatewayException
503: Service Unavailable
ServiceUnavailableException
504: Gateway Timeout
GatewayTimeoutException
@Serviceexport class UserService extends BaseService { async findById(ctx: Context, id: string) { const user = await db.users.find(id);
if (!user) { // Fang capturará esto y enviará un 404 JSON automáticamente throw new NotFoundException(`El usuario con ID ${id} no existe`); }
return user; }}Si tu lógica de negocio requiere errores específicos (como un error de pago o de cuota excedida), puedes extender la clase base fácilmente:
import { HttpException } from "@fang-js/fang/exceptions";
export class PaymentRequiredException extends HttpException { constructor(message = "Suscripción inactiva") { super(message, 402); }}
// Usoif (!hasPaid) throw new PaymentRequiredException();(onError)Recuerda que puedes personalizar cómo se ven estas excepciones cuando llegan al cliente configurando el método onError en tu instancia principal de Fang. Por defecto, Fang responde con un objeto JSON que contiene el nombre del error, el mensaje y el estatus.
app.onError((err, ctx) => { const status = err instanceof HttpException ? err.status : 500;
ctx.json( { success: false, error: err.name, message: err.message, }, status, );});