app.js 4.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. "use strict";
  2. var __importDefault = (this && this.__importDefault) || function (mod) {
  3. return (mod && mod.__esModule) ? mod : { "default": mod };
  4. };
  5. Object.defineProperty(exports, "__esModule", { value: true });
  6. exports.clickhouseService = exports.redisClient = void 0;
  7. // oms/src/app.ts
  8. const dotenv_1 = __importDefault(require("dotenv"));
  9. dotenv_1.default.config(); // 在读取环境变量之前加载 .env 文件
  10. const express_1 = __importDefault(require("express")); // 导入 NextFunction
  11. const redis_1 = require("redis");
  12. const path_1 = __importDefault(require("path"));
  13. const apiRoutes_1 = __importDefault(require("./routes/apiRoutes"));
  14. const clickhouseService_1 = require("./services/clickhouseService");
  15. const database_1 = require("./database");
  16. const app = (0, express_1.default)();
  17. const port = process.env.PORT || 3000;
  18. const mongoUri = process.env.MONGO_URI || "mongodb://oms:oms123.@localhost:27717/omsdb?authSource=admin";
  19. const redisUri = process.env.REDIS_URI || "redis://redis:6379";
  20. const clickhouseHost = process.env.CLICKHOUSE_HOST || "http://localhost:8123"; // 👈 ClickHouse 主机
  21. const clickhouseDatabase = process.env.CLICKHOUSE_DATABASE || "omsdb"; // 👈 ClickHouse 数据库名
  22. const clickhouseUser = process.env.CLICKHOUSE_USER;
  23. const clickhousePassword = process.env.CLICKHOUSE_PASSWORD;
  24. // Initialize ClickhouseService
  25. const clickhouseService = new clickhouseService_1.ClickhouseService(clickhouseHost, clickhouseDatabase, clickhouseUser, clickhousePassword);
  26. exports.clickhouseService = clickhouseService;
  27. const clickhouseTableName = "events"; // ClickHouse 日志表的名称
  28. // MongoDB connection
  29. (0, database_1.connectToDatabase)();
  30. // Redis client
  31. // Using the modern 'redis' package client setup
  32. const redisClient = (0, redis_1.createClient)({ url: redisUri }); // 👈 使用解构后的 createClient
  33. exports.redisClient = redisClient;
  34. redisClient.on("connect", () => console.log("Connected to Redis"));
  35. redisClient.on("error", (err) => console.error("Redis connection error:", err));
  36. // Connect to Redis when the application starts
  37. (async () => {
  38. try {
  39. await redisClient.connect();
  40. // 确保 ClickHouse 表在应用启动时存在
  41. await clickhouseService.ensureTable(clickhouseTableName);
  42. }
  43. catch (err) {
  44. console.error("Failed to connect to essential services:", err);
  45. process.exit(1); // 如果连接失败,退出应用
  46. }
  47. })();
  48. // Middleware
  49. app.use(express_1.default.json());
  50. // 新增中间件:为每个API请求添加日志打印
  51. app.use((req, res, next) => {
  52. console.log(`[API Request] ${new Date().toISOString()} - ${req.method} ${req.originalUrl}`);
  53. next();
  54. });
  55. // --- 在这里添加全局禁用缓存的中间件 ---
  56. // app.use("/api", (req: Request, res: Response, next: NextFunction) => {
  57. // // 为所有 API 路由显式禁用浏览器缓存
  58. // res.set({
  59. // "Cache-Control": "no-cache, no-store, must-revalidate",
  60. // Pragma: "no-cache",
  61. // Expires: "0",
  62. // ETag: null, // 移除ETag以强制浏览器重新验证
  63. // "Last-Modified": null, // 移除Last-Modified以强制浏览器重新验证
  64. // });
  65. // next();
  66. // });
  67. // ------------------------------------
  68. // API routes
  69. app.use("/api", apiRoutes_1.default);
  70. // 动态设置公共目录和Angular应用路径
  71. let publicPath;
  72. let angularAppPath;
  73. if (process.env.NODE_ENV === "production") {
  74. // 如果在生产环境中,从 dist 目录往上一层找到 public
  75. publicPath = path_1.default.resolve(__dirname, "..", "..", "public");
  76. angularAppPath = path_1.default.join(publicPath, "app");
  77. }
  78. else {
  79. // 如果在开发环境中,public 目录就在当前目录的上一层(相对于src)
  80. publicPath = path_1.default.resolve(__dirname, "..", "public");
  81. angularAppPath = path_1.default.join(publicPath, "app");
  82. }
  83. console.log(process.env.NODE_ENV);
  84. console.log(`publicPath: ${publicPath}`);
  85. console.log(`angularAppPath: ${angularAppPath}`);
  86. // 服务 Angular 应用的静态文件
  87. // Express 会在 public 目录下寻找请求的静态文件,如 /app/main.js
  88. app.use(express_1.default.static(publicPath));
  89. // 作为最终的备用,处理所有未被前面路由处理的请求
  90. // 这是最标准的单页面应用(SPA)路由处理方式
  91. app.use((req, res) => {
  92. res.sendFile(path_1.default.join(angularAppPath, "index.html"));
  93. });
  94. // Start the server
  95. app.listen(port, () => {
  96. console.log(`OMS Backend server listening on port ${port}`);
  97. });