Server.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. const express = require('express');
  2. const path = require('path');
  3. const fs = require('fs');
  4. const config = require('../config.json');
  5. const Logger = require('./Logger');
  6. const MySQL = require('../plugin/MySQL');
  7. class SERVER {
  8. constructor() {
  9. this.app = express();
  10. this.port = config.port || 3000;
  11. this.apiDirectory = path.join(__dirname, '../apis'); // API 文件存放目录
  12. this.logger = new Logger(path.join(__dirname, '../logs/Server.log'), 'INFO');
  13. // 解析 JSON 请求体
  14. this.app.use(express.json());
  15. // 初始化数据库连接
  16. this.db = new MySQL();
  17. // 加载 API 路由
  18. this.loadAPIs(this.apiDirectory);
  19. }
  20. // 测试数据库连接
  21. async initDB() {
  22. try {
  23. await this.db.connect();
  24. this.logger.info('数据库连接成功');
  25. } catch (error) {
  26. this.logger.error(`数据库连接失败: ${error.message}`);
  27. process.exit(1);
  28. }
  29. }
  30. loadAPIs(directory) {
  31. this.logger.info('==============正在加载API==============');
  32. const items = fs.readdirSync(directory);
  33. items.forEach(item => {
  34. const itemPath = path.join(directory, item);
  35. const stats = fs.statSync(itemPath);
  36. if (stats.isDirectory()) {
  37. // 如果是目录,递归调用
  38. this.loadAPIs(itemPath);
  39. } else if (stats.isFile() && itemPath.endsWith('.js')) {
  40. // 如果是文件且是 JavaScript 文件
  41. this.loadAPIFile(itemPath);
  42. }
  43. });
  44. this.logger.info('==============API加载完成==============');
  45. }
  46. // 加载单个 API 文件
  47. loadAPIFile(filePath) {
  48. try {
  49. const APIClass = require(filePath);
  50. for (const key in APIClass) {
  51. if (APIClass.hasOwnProperty(key)) {
  52. const apiInstance = new APIClass[key]();
  53. apiInstance.setupRoute();
  54. this.app.use('/', apiInstance.getRouter());
  55. this.logger.info(`已加载API文件: ${filePath}`);
  56. }
  57. }
  58. } catch (error) {
  59. this.logger.error(`加载API文件失败: ${filePath},错误: ${error.message}`);
  60. }
  61. }
  62. start() {
  63. this.logger.info('============正在启动服务器============');
  64. // 初始化数据库连接
  65. this.initDB().then(() => {
  66. this.app.listen(this.port, () => {
  67. this.logger.info(`==========服务器正在 ${this.port} 上运行==========`);
  68. });
  69. }).catch(err => {
  70. this.logger.error(`启动服务器失败: ${err.message}`);
  71. process.exit(1); // 启动失败时退出进程
  72. });
  73. }
  74. }
  75. module.exports = SERVER;