Error Classes
LightTs provides HttpError and specific error classes like ConflictError and BadRequestError to standardize error handling. Generated by lts add responses, these classes and a middleware handler ensure consistent error responses using native Node.js and Express.
Generated Files
Section titled “Generated Files”The lts add responses command adds the following to src/core/errors/, using kebab-case for file names:
Directorysrc/
Directorycore/
Directoryerrors/
- bad-request.error.ts
- conflict.error.ts
- forbidden.error.ts
- handler.error.ts
- index.ts
- not-found.error.ts
- server-error.error.ts
- unauthorized.error.ts
Error Classes
Section titled “Error Classes”These classes use camelCase for methods and variables, supporting common HTTP errors.
import { Request, Response } from 'express';
export class HttpError extends Error { public readonly statusCode: number; public readonly details?: any;
constructor(statusCode: number, message: string, details?: any) { super(message); this.statusCode = statusCode; this.details = details; this.name = this.constructor.name; Error.captureStackTrace(this, this.constructor); }
static middleware(err: any, req: Request, res: Response) { const statusCode = err.statusCode || 500;
res.status(statusCode).json({ success: false, message: err.message || 'internal server error' }); }}import { HttpError } from '.';
export class ConflictError extends HttpError { constructor(message: string = 'conflict', details?: any) { super(409, message, details); }}import { HttpError } from '.';
export class BadRequestError extends HttpError { constructor(message: string = 'bad request', details?: any) { super(400, message, details); }}Setup Error Middleware
Section titled “Setup Error Middleware”Add the error middleware to your application:
import { HttpError } from '@/core/errors';...
// Error middlewareapp.use(HttpError.middleware);
...Example Usage
Section titled “Example Usage”Throw error classes in your services, paired with a simple controller (Express Router).
import { BadRequestError } from '@/core/errors/bad-request.error';import { ConflictError } from '@/core/errors/conflict.error';import { DataResponse } from '@/core/responses/data.response';import { MessageResponse } from '@/core/responses/message.response';import { Request, Response } from 'express';
export default { getUsers: async (req: Request, res: Response) => { const users = [{ id: 1, name: 'John Doe' }];
return new DataResponse(res, { data: users, message: 'Users fetched!', statusCode: 200, }); }, createUser: async (req: Request, res: Response) => { const { email } = req.body; if (!email) throw new BadRequestError('Email is required!');
return new MessageResponse(res, { message: 'User created!', statusCode: 201 }); },};- Customization: Extend
HttpErrorinsrc/core/errors/for custom error types. - Naming Conventions: Files use kebab-case (e.g.,
conflict.error.ts), classes and methods use camelCase (e.g.,ConflictError,throwError). - Error Handling: Place
HttpError.middlewarelast insrc/index.tsto catch all errors. - Available Errors: Includes
BadRequestError(400),ConflictError(409),ForbiddenError(403),NotFoundError(404),UnauthorizedError(401), andServerError(500).
See Errors in Action Try a user management API with standardized error handling.