π View on npm
A lightweight, production-ready error handling toolkit for Express.js applications β written in TypeScript with full support for both CommonJS and ESM.
If you like the project, please give the project a GitHub β
It provides:
- Custom error classes (
NotFoundError,BadRequestError,ValidationError, etc.) - Express middleware:
globalErrorHandler,notFoundHandler - An
asyncHandlerutility to handle async errors without boilerplate - A
httpError()factory function to create custom error instances easily isCustomAPIError()type guard for safe error type checks
- β Type-safe custom error classes
- β Centralized error-handling middleware
- β Async error wrapper for route handlers
- β Built-in 404 (Not Found) handler
- β Factory method for generating custom errors
- β Type guard for runtime error checking
- β Out-of-the-box support for both CJS and ESM
You can install express-error-toolkit using your favorite package manager.
npm install express-error-toolkityarn add express-error-toolkitpnpm add express-error-toolkitβοΈ Requires Node.js v14 or higher. βΉοΈ Make sure you have
expressinstalled in your project, as this toolkit is built specifically to enhance Express.js error handling.
import express from 'express'; import { asyncHandler } from 'express-error-toolkit'; const app = express(); app.get( '/users/:id', asyncHandler(async (req, res) => { // Your async code here throw new Error('Something went wrong!'); }) );import { NotFoundError, BadRequestError } from 'express-error-toolkit'; app.get('/test', (req, res) => { throw new NotFoundError('User not found'); });Each custom error automatically sets the correct statusCode and name.
You can also pass optional errorDetails as a string, object, or leave it out:
throw new BadRequestError('Invalid data', { field: 'email' }); throw new BadRequestError('Invalid input', 'Missing required field'); throw new BadRequestError('Generic client error');import { notFoundHandler } from 'express-error-toolkit'; app.use(notFoundHandler);This will throw a NotFoundError with the method and route info.
import { globalErrorHandler } from 'express-error-toolkit'; app.use(globalErrorHandler);By default, the handler includes the stack trace and logs the error in development. In production (NODE_ENV=production), both are automatically suppressed for safety.
To enhance developer experience during debugging, this toolkit uses ANSI escape codes β no external dependencies like chalk required β to make console logs more readable.
Each part of the error log is styled using a traffic light-inspired color scheme:
- π΄ Error Status & Message β Red
- π‘ Error Details β Yellow (optional; string or object)
- π’ Stack Trace β Green (shown only if available and enabled)
πΌοΈ Example: Here's how the console might look in development mode:
By default, an introductory line ("Even the best code breaks sometimes! Let's debug...") is displayed before each error block.
You can control this with the introLine option:
import { setErrorOptions } from 'express-error-toolkit'; // Disable the intro line setErrorOptions({ introLine: false }); // Customize the intro line setErrorOptions({ introLine: 'π¨ Debugging session begins here...' });You can configure the error handling behavior (e.g., hide stack traces and disable console logging even in development) using either:
SHOW_STACK=false LOG_ERROR=falseor directly in your code:
import { setErrorOptions } from 'express-error-toolkit'; setErrorOptions({ showStack: false, logError: false });This overrides the default behavior (based on NODE_ENV or .env file).
import { httpError } from 'express-error-toolkit'; throw httpError('Something custom', 418);You can also pass optional errorDetails as a string, object, or leave it out:
throw httpError('Expectation failed', 417, { reason: 'The server could not meet the Expect header requirements' }); throw httpError('Failed Dependency', 424, 'This request relies on a previous request that failed' ); throw httpError('Unavailable for legal reason', 451);import { isCustomAPIError } from 'express-error-toolkit'; if (isCustomAPIError(err)) { console.log(err.statusCode, err.message); // your rest of the code }| Error Class | Default Message | Status Code |
|---|---|---|
BadRequestError | Bad Request | 400 |
UnauthorizedError | Unauthorized | 401 |
ForbiddenError | Forbidden | 403 |
NotFoundError | Not Found | 404 |
ConflictError | Conflict | 409 |
ValidationError | Unprocessable Entity | 422 |
TooManyRequestsError | Too Many Requests | 429 |
CustomAPIError | Internal Server Error | 500 |
βββ src/ β βββ error/ β β βββ BadRequestError.ts β β βββ NotFoundError.ts β β βββ ... β βββ global-error-handler.ts β βββ async-handler.ts β βββ http-error.ts β βββ index.ts βββ example/ β βββ index.ts βββ __tests__/ β βββ *.test.ts - Fully written in TypeScript
- Outputs:
- CommonJS:
dist/index.cjs - ESM:
dist/index.js - Types:
dist/index.d.ts
- CommonJS:
MIT Β© Rashedin Islam
This project includes http-status-toolkit, also created by me.
We welcome contributions! Please check out the Contributing Guide.
- GitHub: dev-rashedin
- Portfolio: rashedin.dev
Made with β€οΈ by Rashedin Islam
