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
HttpError
insrc/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.middleware
last insrc/index.ts
to 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.