geoapify-mcp-server
Version:
Geoapify API MCP Server for location-based services - 一键部署的地理位置服务
84 lines (74 loc) • 2.32 kB
JavaScript
const { logger } = require('../utils/logger.js');
const errorHandler = (err, req, res, next) => {
// 记录错误
logger.error('Error occurred:', {
error: err.message,
stack: err.stack,
url: req.url,
method: req.method,
ip: req.ip,
userAgent: req.get('User-Agent')
});
// 默认错误响应
let statusCode = 500;
let message = 'Internal Server Error';
let details = null;
// 根据错误类型设置响应
if (err.name === 'ValidationError') {
statusCode = 400;
message = 'Validation Error';
details = err.message;
} else if (err.message.includes('Invalid API key')) {
statusCode = 401;
message = 'Unauthorized';
details = 'Invalid or missing API key';
} else if (err.message.includes('quota exceeded') || err.message.includes('Rate limit')) {
statusCode = 429;
message = 'Too Many Requests';
details = err.message;
} else if (err.message.includes('Bad request')) {
statusCode = 400;
message = 'Bad Request';
details = err.message;
} else if (err.message.includes('not found')) {
statusCode = 404;
message = 'Not Found';
details = err.message;
} else if (err.code === 'ECONNREFUSED' || err.code === 'ENOTFOUND') {
statusCode = 503;
message = 'Service Unavailable';
details = 'External service temporarily unavailable';
} else if (err.code === 'ETIMEDOUT') {
statusCode = 504;
message = 'Gateway Timeout';
details = 'Request timeout';
}
// 构建错误响应
const errorResponse = {
success: false,
error: message,
timestamp: new Date().toISOString()
};
// 在开发环境中包含更多错误信息
if (process.env.NODE_ENV === 'development') {
errorResponse.details = details || err.message;
errorResponse.stack = err.stack;
} else if (details) {
errorResponse.details = details;
}
res.status(statusCode).json(errorResponse);
};
const notFoundHandler = (req, res) => {
res.status(404).json({
success: false,
error: 'Not Found',
message: `Cannot ${req.method} ${req.originalUrl}`,
timestamp: new Date().toISOString()
});
};
const asyncHandler = (fn) => {
return (req, res, next) => {
Promise.resolve(fn(req, res, next)).catch(next);
};
};
module.exports = { errorHandler, notFoundHandler, asyncHandler };