@tomisakae/syosetu-api
Version:
Enterprise-grade Fastify TypeScript API for Syosetu.com data extraction using official API and web scraping. Run instantly with 'npx @tomisakae/syosetu-api'
70 lines • 2.31 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.errorHandler = void 0;
const utils_1 = require("@/utils");
const config_1 = require("@/config");
const logger = (0, utils_1.createChildLogger)('ErrorHandler');
const errorHandler = (error, request, reply) => {
logger.error({
error: {
message: error.message,
stack: error.stack,
code: error.code,
},
request: {
method: request.method,
url: request.url,
headers: request.headers,
params: request.params,
query: request.query,
},
}, 'Request error occurred');
if (error.validation) {
void reply.status(400).send({
success: false,
error: 'Validation failed',
details: error.validation,
timestamp: new Date().toISOString(),
});
return;
}
if (error.statusCode === 429) {
void reply.status(429).send({
success: false,
error: 'Too many requests',
message: 'Rate limit exceeded. Please try again later.',
timestamp: new Date().toISOString(),
});
return;
}
if (error.statusCode === 404) {
void reply.status(404).send({
success: false,
error: 'Not found',
message: 'The requested resource was not found',
timestamp: new Date().toISOString(),
});
return;
}
if (error.code === 'TIMEOUT' || error.message.includes('timeout')) {
void reply.status(408).send({
success: false,
error: 'Request timeout',
message: 'The request took too long to complete',
timestamp: new Date().toISOString(),
});
return;
}
const statusCode = error.statusCode || 500;
const message = config_1.appConfig.nodeEnv === 'production'
? 'Internal server error'
: error.message;
void reply.status(statusCode).send({
success: false,
error: message,
...(config_1.appConfig.nodeEnv === 'development' && { stack: error.stack }),
timestamp: new Date().toISOString(),
});
};
exports.errorHandler = errorHandler;
//# sourceMappingURL=error-handler.js.map