Server.js 2.8 KB

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