UNPKG

geoapify-mcp-server

Version:

Geoapify API MCP Server for location-based services - 一键部署的地理位置服务

84 lines (74 loc) 2.32 kB
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 };