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
text/typescript
/**
* 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);
};