UNPKG

dnsweeper

Version:

Advanced CLI tool for DNS record risk analysis and cleanup. Features CSV import for Cloudflare/Route53, automated risk assessment, and parallel DNS validation.

86 lines (77 loc) 2.13 kB
/** * Error Handling Middleware */ import { Request, Response, NextFunction } from 'express'; import { logger } from '../utils/logger.js'; export interface ApiError extends Error { statusCode?: number; code?: string; details?: any; } export const errorHandler = ( error: ApiError, req: Request, res: Response, next: NextFunction ) => { logger.error('API Error:', { error: error.message, stack: error.stack, url: req.originalUrl, method: req.method, ip: req.ip, userAgent: req.get('User-Agent') }); // デフォルトのステータスコード let statusCode = error.statusCode || 500; let message = error.message || 'Internal Server Error'; // 特定のエラータイプの処理 if (error.name === 'ValidationError') { statusCode = 400; message = 'Validation Error'; } else if (error.name === 'UnauthorizedError') { statusCode = 401; message = 'Unauthorized'; } else if (error.name === 'ForbiddenError') { statusCode = 403; message = 'Forbidden'; } else if (error.name === 'NotFoundError') { statusCode = 404; message = 'Not Found'; } else if (error.name === 'ConflictError') { statusCode = 409; message = 'Conflict'; } // Multerエラーの処理 if (error.code === 'LIMIT_FILE_SIZE') { statusCode = 413; message = 'File too large'; } else if (error.code === 'LIMIT_FILE_COUNT') { statusCode = 400; message = 'Too many files'; } else if (error.code === 'LIMIT_UNEXPECTED_FILE') { statusCode = 400; message = 'Unexpected file field'; } // JSON構文エラー if (error instanceof SyntaxError && 'body' in error) { statusCode = 400; message = 'Invalid JSON'; } const errorResponse = { error: { message, code: error.code || 'INTERNAL_ERROR', statusCode, ...(process.env.NODE_ENV === 'development' && { stack: error.stack, details: error.details }) }, success: false, timestamp: new Date().toISOString(), path: req.originalUrl, method: req.method }; res.status(statusCode).json(errorResponse); };