Server.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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/DataBase/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. this.logger.info('正在测试数据库连接');
  24. await this.db.connect();
  25. await this.db.close();
  26. } catch (error) {
  27. this.logger.error(`数据库连接失败: ${error.stack}`);
  28. process.exit(1);
  29. }
  30. }
  31. loadAPIs(directory) {
  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. }
  45. // 加载单个 API 文件
  46. loadAPIFile(filePath) {
  47. try {
  48. const APIClass = require(filePath);
  49. for (const key in APIClass) {
  50. if (APIClass.hasOwnProperty(key)) {
  51. const apiInstance = new APIClass[key]();
  52. apiInstance.setupRoute();
  53. this.app.use('/', apiInstance.getRouter());
  54. this.logger.info(`已加载API文件: ${filePath}`);
  55. }
  56. }
  57. } catch (error) {
  58. this.logger.error(`加载API文件失败: ${filePath},错误: ${error.stack}`);
  59. }
  60. }
  61. start() {
  62. this.logger.info('============正在启动服务器============');
  63. // 初始化数据库连接
  64. this.initDB().then(() => {
  65. this.app.listen(this.port, () => {
  66. this.logger.info(`==========服务器正在 ${this.port} 端口上运行==========`);
  67. });
  68. }).catch(err => {
  69. this.logger.error(`启动服务器失败: ${err.message}`);
  70. process.exit(1); // 启动失败时退出进程
  71. });
  72. }
  73. }
  74. module.exports = SERVER;