Server.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. const express = require('express')
  2. const cors = require('cors')
  3. const path = require('path')
  4. const fs = require('fs')
  5. const config = require('../config.json')
  6. const Logger = require('./Logger')
  7. const MySQL = require('../plugin/DataBase/MySQL')
  8. const mq = require('../plugin/mq')
  9. const initmq = require('../plugin/mq/init')
  10. const lepao = require("./Lepao/cg_lepao").Lepao
  11. class SERVER {
  12. constructor() {
  13. this.app = express()
  14. this.port = config.port || 3000
  15. this.apiDirectory = path.join(__dirname, '../apis') // API 文件存放目录
  16. this.logger = new Logger(path.join(__dirname, '../logs/Server.log'), 'INFO')
  17. // 解析 JSON 请求体
  18. this.app.use(express.json())
  19. //解决cors跨域
  20. this.app.use(cors())
  21. //使用静态资源
  22. this.app.use('/uploads', express.static('./uploads'))
  23. this.app.use('/models', express.static('./models'))
  24. // 初始化数据库连接
  25. this.db = new MySQL()
  26. // 加载 API 路由
  27. this.loadAPIs(this.apiDirectory)
  28. }
  29. // 测试数据库连接
  30. async initDB() {
  31. try {
  32. this.logger.info('正在测试数据库连接')
  33. await this.db.connect()
  34. await this.db.close()
  35. } catch (error) {
  36. this.logger.error(`数据库连接失败: ${error.stack}`)
  37. process.exit(1)
  38. }
  39. }
  40. // 测试MQ连接
  41. async initMQ() {
  42. try {
  43. await mq.init()
  44. const ch = await mq.getChannel('health')
  45. await initmq()
  46. this.logger.info('✅ RabbitMQ 初始化成功')
  47. } catch (e) {
  48. this.logger.error('❌ RabbitMQ 初始化失败')
  49. process.exit(1)
  50. }
  51. }
  52. loadAPIs(directory) {
  53. const items = fs.readdirSync(directory)
  54. items.forEach(item => {
  55. const itemPath = path.join(directory, item)
  56. const stats = fs.statSync(itemPath)
  57. if (stats.isDirectory()) {
  58. // 如果是目录,递归调用
  59. this.loadAPIs(itemPath)
  60. } else if (stats.isFile() && itemPath.endsWith('.js')) {
  61. // 如果是文件且是 JavaScript 文件
  62. this.loadAPIFile(itemPath)
  63. }
  64. })
  65. }
  66. // 加载单个 API 文件
  67. loadAPIFile(filePath) {
  68. try {
  69. const APIClass = require(filePath)
  70. for (const key in APIClass) {
  71. if (APIClass.hasOwnProperty(key)) {
  72. const apiInstance = new APIClass[key]()
  73. apiInstance.setupRoute()
  74. this.app.use('/', apiInstance.getRouter())
  75. this.logger.info(`已加载API:${apiInstance.path} 类型:${apiInstance.method}`)
  76. }
  77. }
  78. } catch (error) {
  79. this.logger.error(`加载API文件失败: ${filePath},错误: ${error.stack}`)
  80. }
  81. }
  82. start() {
  83. this.logger.info('============正在启动服务器============')
  84. // 初始化数据库连接
  85. this.initDB().then(() => {
  86. this.initMQ().then(() => {
  87. this.app.listen(this.port, () => {
  88. this.logger.info(`==========服务器正在 ${this.port} 端口上运行==========`)
  89. })
  90. lepao.lepaoFinish()
  91. }).catch(err => {
  92. this.logger.error(`启动服务器失败: ${err.message}`)
  93. })
  94. }).catch(err => {
  95. this.logger.error(`启动服务器失败: ${err.message}`)
  96. process.exit(1) // 启动失败时退出进程
  97. })
  98. }
  99. }
  100. module.exports = SERVER