const express = require('express') const cors = require('cors') const path = require('path') const fs = require('fs') const config = require('../config.json') const Logger = require('./Logger') const MySQL = require('../plugin/DataBase/MySQL') const Worker = require('./Lepao/Worker') const mq = require('../plugin/mq') class SERVER { constructor() { this.app = express() this.port = config.port || 3000 this.apiDirectory = path.join(__dirname, '../apis') // API 文件存放目录 this.logger = new Logger(path.join(__dirname, '../logs/Server.log'), 'INFO') // 解析 JSON 请求体 this.app.use(express.json()) //解决cors跨域 this.app.use(cors()) //使用静态资源 this.app.use('/uploads', express.static('./uploads')) this.app.use('/models', express.static('./models')) // 初始化数据库连接 this.db = new MySQL() // 加载 API 路由 this.loadAPIs(this.apiDirectory) } // 测试数据库连接 async initDB() { try { this.logger.info('正在测试数据库连接') await this.db.connect() await this.db.close() } catch (error) { this.logger.error(`数据库连接失败: ${error.stack}`) process.exit(1) } } // 测试MQ连接 async initMQ() { try { await mq.init() const ch = await mq.getChannel('health') await ch.assertQueue('mq_health_check', { durable: false }) this.logger.info('✅ RabbitMQ 初始化 & 测试成功') const worker = new Worker() try { await worker.start() this.logger.info('RunForge Worker 已启动,正在监听 MQ 任务...') } catch (err) { console.error('RunForge Worker 启动失败:', err) process.exit(1) } } catch (e) { this.logger.error('❌ RabbitMQ 初始化失败') process.exit(1) } } loadAPIs(directory) { const items = fs.readdirSync(directory) items.forEach(item => { const itemPath = path.join(directory, item) const stats = fs.statSync(itemPath) if (stats.isDirectory()) { // 如果是目录,递归调用 this.loadAPIs(itemPath) } else if (stats.isFile() && itemPath.endsWith('.js')) { // 如果是文件且是 JavaScript 文件 this.loadAPIFile(itemPath) } }) } // 加载单个 API 文件 loadAPIFile(filePath) { try { const APIClass = require(filePath) for (const key in APIClass) { if (APIClass.hasOwnProperty(key)) { const apiInstance = new APIClass[key]() apiInstance.setupRoute() this.app.use('/', apiInstance.getRouter()) this.logger.info(`已加载API:${apiInstance.path} 类型:${apiInstance.method}`) } } } catch (error) { this.logger.error(`加载API文件失败: ${filePath},错误: ${error.stack}`) } } start() { this.logger.info('============正在启动服务器============') // 初始化数据库连接 this.initDB().then(() => { this.initMQ().then(() => { this.app.listen(this.port, () => { this.logger.info(`==========服务器正在 ${this.port} 端口上运行==========`) }) }).catch(err => { this.logger.error(`启动服务器失败: ${err.message}`) }) }).catch(err => { this.logger.error(`启动服务器失败: ${err.message}`) process.exit(1) // 启动失败时退出进程 }) } } module.exports = SERVER