guoziyun 9 月之前
父节点
当前提交
73ea7ae0a4

+ 3 - 3
oms/dist/services/cron-jobs/done-rate.js

@@ -6,7 +6,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 const dayjs_1 = __importDefault(require("dayjs"));
 const doneRateService_1 = __importDefault(require("../../src/services/doneRateService")); // 导入 DoneRateService
 const artService_1 = __importDefault(require("../../src/services/artService")); // 👈 导入 ArtService
-const app_1 = require("../../src/app"); // 导入 ClickhouseService 实例
+const clients_1 = require("../../src/services/clients");
 const mongoose_1 = __importDefault(require("mongoose")); // 导入 mongoose 和 Connection 用于处理远程连接
 const artModel_1 = __importDefault(require("../../src/models/artModel")); // 👈 导入 Art 模型和 IArt 接口
 // ClickHouse 表名
@@ -46,7 +46,7 @@ async function run() {
       GROUP BY res
       HAVING res IS NOT NULL
     `;
-        const startResults = await app_1.clickhouseService.queryEvents(startCountsQuery);
+        const startResults = await clients_1.clickhouseService.queryEvents(startCountsQuery);
         const artworkStartCounts = new Map();
         startResults.forEach((row) => {
             if (row.res && mongoose_1.default.Types.ObjectId.isValid(row.res)) {
@@ -69,7 +69,7 @@ async function run() {
       GROUP BY res
       HAVING res IS NOT NULL
     `;
-        const doneResults = await app_1.clickhouseService.queryEvents(doneCountsQuery);
+        const doneResults = await clients_1.clickhouseService.queryEvents(doneCountsQuery);
         const artworkDoneCounts = new Map();
         doneResults.forEach((row) => {
             if (row.res && mongoose_1.default.Types.ObjectId.isValid(row.res)) {

+ 3 - 3
oms/dist/services/cron-jobs/done-rate2.js

@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 };
 const dayjs_1 = __importDefault(require("dayjs"));
 const doneRateService_1 = __importDefault(require("../../src/services/doneRateService")); // 导入 DoneRateService
-const app_1 = require("../../src/app"); // 导入 ClickhouseService 实例
+const clients_1 = require("../../src/services/clients");
 const mongoose_1 = __importDefault(require("mongoose")); // 导入 mongoose 和 Connection 用于处理远程连接
 const totalDoneRateModel_1 = __importDefault(require("../../src/models/totalDoneRateModel")); // 导入新的 TotalDoneRate 模型
 // ClickHouse 表名
@@ -41,7 +41,7 @@ async function run() {
       GROUP BY res
       HAVING res IS NOT NULL
     `;
-        const startResults = await app_1.clickhouseService.queryEvents(startCountsQuery);
+        const startResults = await clients_1.clickhouseService.queryEvents(startCountsQuery);
         const artworkStartCounts = new Map();
         startResults.forEach((row) => {
             if (row.res && mongoose_1.default.Types.ObjectId.isValid(row.res)) {
@@ -64,7 +64,7 @@ async function run() {
       GROUP BY res
       HAVING res IS NOT NULL
     `;
-        const doneResults = await app_1.clickhouseService.queryEvents(doneCountsQuery);
+        const doneResults = await clients_1.clickhouseService.queryEvents(doneCountsQuery);
         const artworkDoneCounts = new Map();
         doneResults.forEach((row) => {
             if (row.res && mongoose_1.default.Types.ObjectId.isValid(row.res)) {

+ 3 - 3
oms/dist/services/cron-jobs/index.js

@@ -6,7 +6,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.startCronJobs = startCronJobs;
 const node_cron_1 = __importDefault(require("node-cron")); // Import node-cron library
-const database_1 = require("../../src/database");
+const clients_1 = require("../../src/services/clients"); // 从新的文件导入
 // Define the settings array for cron jobs
 // Each element: [name: string, schedule: string, jobModule: CronJobModule]
 const settings = [
@@ -23,8 +23,8 @@ const settings = [
  */
 async function startCronJobs() {
     console.log("[Cron Jobs] Initializing all scheduled tasks...");
-    // 在启动所有定时任务之前,首先建立数据库连接
-    await (0, database_1.connectToDatabase)();
+    // 先初始化客户端服务
+    await (0, clients_1.initializeClients)();
     // Iterate through settings and schedule each job
     settings.forEach((setting) => {
         const [name, schedule, job] = setting;

+ 17 - 52
oms/dist/src/app.js

@@ -4,83 +4,48 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 };
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.clickhouseService = exports.redisClient = void 0;
-// oms/src/app.ts
 const dotenv_1 = __importDefault(require("dotenv"));
-dotenv_1.default.config(); // 在读取环境变量之前加载 .env 文件
-const express_1 = __importDefault(require("express")); // 导入 NextFunction
-const redis_1 = require("redis");
+dotenv_1.default.config();
+const express_1 = __importDefault(require("express"));
+const http_1 = __importDefault(require("http")); // For controlling keepAliveTimeout
 const path_1 = __importDefault(require("path"));
 const apiRoutes_1 = __importDefault(require("./routes/apiRoutes"));
-const clickhouseService_1 = require("./services/clickhouseService");
-const database_1 = require("./database");
+const clients_1 = require("./services/clients"); // 导入新的初始化函数和客户端
+Object.defineProperty(exports, "redisClient", { enumerable: true, get: function () { return clients_1.redisClient; } });
+Object.defineProperty(exports, "clickhouseService", { enumerable: true, get: function () { return clients_1.clickhouseService; } });
 const app = (0, express_1.default)();
 const port = process.env.PORT || 3000;
-const mongoUri = process.env.MONGO_URI || "mongodb://oms:oms123.@localhost:27717/omsdb?authSource=admin";
-const redisUri = process.env.REDIS_URI || "redis://redis:6379";
-const clickhouseHost = process.env.CLICKHOUSE_HOST || "http://localhost:8123"; // 👈 ClickHouse 主机
-const clickhouseDatabase = process.env.CLICKHOUSE_DATABASE || "omsdb"; // 👈 ClickHouse 数据库名
-const clickhouseUser = process.env.CLICKHOUSE_USER;
-const clickhousePassword = process.env.CLICKHOUSE_PASSWORD;
-// Initialize ClickhouseService
-const clickhouseService = new clickhouseService_1.ClickhouseService(clickhouseHost, clickhouseDatabase, clickhouseUser, clickhousePassword);
-exports.clickhouseService = clickhouseService;
-const clickhouseTableName = "events"; // ClickHouse 日志表的名称
-// MongoDB connection
-(0, database_1.connectToDatabase)();
-// Redis client
-// Using the modern 'redis' package client setup
-const redisClient = (0, redis_1.createClient)({ url: redisUri }); // 👈 使用解构后的 createClient
-exports.redisClient = redisClient;
-redisClient.on("connect", () => console.log("Connected to Redis"));
-redisClient.on("error", (err) => console.error("Redis connection error:", err));
-// Connect to Redis when the application starts
-(async () => {
-    try {
-        await redisClient.connect();
-        // 确保 ClickHouse 表在应用启动时存在
-        await clickhouseService.ensureTable(clickhouseTableName);
-    }
-    catch (err) {
-        console.error("Failed to connect to essential services:", err);
-        process.exit(1); // 如果连接失败,退出应用
-    }
-})();
 // Middleware
-// 服务部署在反向代理(如 Nginx)后面,需设置此项以正确获取客户端 IP
 app.set("trust proxy", true);
 app.use(express_1.default.json());
-// 新增中间件:为每个API请求添加日志打印
-app.use((req, res, next) => {
-    console.log(`[API Request] ${new Date().toISOString()} - ${req.method} ${req.originalUrl}`);
-    next();
-});
 // API routes
 app.use("/api", apiRoutes_1.default);
-// 动态设置公共目录和Angular应用路径
+// Static and SPA routing... (Keep your existing code here)
 let publicPath;
 let angularAppPath;
 if (process.env.NODE_ENV === "production") {
-    // 如果在生产环境中,从 dist 目录往上一层找到 public
     publicPath = path_1.default.resolve(__dirname, "..", "..", "public");
     angularAppPath = path_1.default.join(publicPath, "app");
 }
 else {
-    // 如果在开发环境中,public 目录就在当前目录的上一层(相对于src)
     publicPath = path_1.default.resolve(__dirname, "..", "public");
     angularAppPath = path_1.default.join(publicPath, "app");
 }
 console.log(process.env.NODE_ENV);
 console.log(`publicPath: ${publicPath}`);
 console.log(`angularAppPath: ${angularAppPath}`);
-// 服务 Angular 应用的静态文件
-// Express 会在 public 目录下寻找请求的静态文件,如 /app/main.js
 app.use(express_1.default.static(publicPath));
-// 作为最终的备用,处理所有未被前面路由处理的请求
-// 这是最标准的单页面应用(SPA)路由处理方式
 app.use((req, res) => {
     res.sendFile(path_1.default.join(angularAppPath, "index.html"));
 });
 // Start the server
-app.listen(port, () => {
-    console.log(`OMS Backend server listening on port ${port}`);
-});
+async function startServer() {
+    await (0, clients_1.initializeClients)(); // 先初始化所有客户端
+    const server = http_1.default.createServer(app);
+    // server.keepAliveTimeout = 61 * 1000;
+    // server.headersTimeout = 65 * 1000;
+    server.listen(port, () => {
+        console.log(`OMS Backend server listening on port ${port}`);
+    });
+}
+startServer();

+ 36 - 0
oms/dist/src/services/clients.js

@@ -0,0 +1,36 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.clickhouseService = exports.redisClient = void 0;
+exports.initializeClients = initializeClients;
+const redis_1 = require("redis");
+const clickhouseService_1 = require("./clickhouseService");
+const database_1 = require("../database");
+// ClickHouse settings
+const clickhouseHost = process.env.CLICKHOUSE_HOST || "http://localhost:8123";
+const clickhouseDatabase = process.env.CLICKHOUSE_DATABASE || "omsdb";
+const clickhouseUser = process.env.CLICKHOUSE_USER;
+const clickhousePassword = process.env.CLICKHOUSE_PASSWORD;
+// MongoDB connection
+(0, database_1.connectToDatabase)();
+// Redis client
+const redisUri = process.env.REDIS_URI || "redis://redis:6379";
+const redisClient = (0, redis_1.createClient)({ url: redisUri });
+exports.redisClient = redisClient;
+redisClient.on("connect", () => console.log("Connected to Redis"));
+redisClient.on("error", (err) => console.error("Redis connection error:", err));
+// Clickhouse client
+const clickhouseService = new clickhouseService_1.ClickhouseService(clickhouseHost, clickhouseDatabase, clickhouseUser, clickhousePassword);
+exports.clickhouseService = clickhouseService;
+const clickhouseTableName = "events";
+// Initialize essential services
+async function initializeClients() {
+    try {
+        await redisClient.connect();
+        await clickhouseService.ensureTable(clickhouseTableName);
+        console.log("[Clients] All essential services connected successfully.");
+    }
+    catch (err) {
+        console.error("[Clients] Failed to connect to essential services:", err);
+        process.exit(1);
+    }
+}

+ 1 - 1
oms/services/cron-jobs/done-rate.ts

@@ -3,7 +3,7 @@
 import dayjs from "dayjs";
 import doneRateService from "../../src/services/doneRateService"; // 导入 DoneRateService
 import artService from "../../src/services/artService"; // 👈 导入 ArtService
-import { clickhouseService } from "../../src/app"; // 导入 ClickhouseService 实例
+import { clickhouseService } from "../../src/services/clients";
 import mongoose, { Connection } from "mongoose"; // 导入 mongoose 和 Connection 用于处理远程连接
 import Art, { IArt } from "../../src/models/artModel"; // 👈 导入 Art 模型和 IArt 接口
 

+ 1 - 1
oms/services/cron-jobs/done-rate2.ts

@@ -2,7 +2,7 @@
 
 import dayjs from "dayjs";
 import doneRateService from "../../src/services/doneRateService"; // 导入 DoneRateService
-import { clickhouseService } from "../../src/app"; // 导入 ClickhouseService 实例
+import { clickhouseService } from "../../src/services/clients";
 import mongoose, { Connection } from "mongoose"; // 导入 mongoose 和 Connection 用于处理远程连接
 import TotalDoneRate from "../../src/models/totalDoneRateModel"; // 导入新的 TotalDoneRate 模型
 

+ 3 - 3
oms/services/cron-jobs/index.ts

@@ -2,7 +2,7 @@
 
 import cron from "node-cron"; // Import node-cron library
 
-import { connectToDatabase, disconnectFromDatabase } from "../../src/database";
+import { initializeClients, clickhouseService } from "../../src/services/clients"; // 从新的文件导入
 
 // Define an interface for a cron job module
 interface CronJobModule {
@@ -27,8 +27,8 @@ const settings: [string, string, CronJobModule][] = [
 export async function startCronJobs(): Promise<void> {
   console.log("[Cron Jobs] Initializing all scheduled tasks...");
 
-  // 在启动所有定时任务之前,首先建立数据库连接
-  await connectToDatabase();
+  // 先初始化客户端服务
+  await initializeClients();
 
   // Iterate through settings and schedule each job
   settings.forEach((setting) => {

+ 18 - 63
oms/src/app.ts

@@ -1,97 +1,52 @@
-// oms/src/app.ts
 import dotenv from "dotenv";
-dotenv.config(); // 在读取环境变量之前加载 .env 文件
+dotenv.config();
 
-import express, { Request, Response, NextFunction } from "express"; // 导入 NextFunction
-import { createClient } from "redis";
+import express, { Request, Response, NextFunction } from "express";
+import http from "http"; // For controlling keepAliveTimeout
 import path from "path";
 import apiRoutes from "./routes/apiRoutes";
-import { ClickhouseService } from "./services/clickhouseService";
-import { connectToDatabase } from "./database";
+import { initializeClients, redisClient, clickhouseService } from "./services/clients"; // 导入新的初始化函数和客户端
 
 const app = express();
 const port = process.env.PORT || 3000;
-const mongoUri = process.env.MONGO_URI || "mongodb://oms:oms123.@localhost:27717/omsdb?authSource=admin";
-const redisUri = process.env.REDIS_URI || "redis://redis:6379";
-const clickhouseHost = process.env.CLICKHOUSE_HOST || "http://localhost:8123"; // 👈 ClickHouse 主机
-const clickhouseDatabase = process.env.CLICKHOUSE_DATABASE || "omsdb"; // 👈 ClickHouse 数据库名
-const clickhouseUser = process.env.CLICKHOUSE_USER;
-const clickhousePassword = process.env.CLICKHOUSE_PASSWORD;
-
-// Initialize ClickhouseService
-const clickhouseService = new ClickhouseService(clickhouseHost, clickhouseDatabase, clickhouseUser, clickhousePassword);
-const clickhouseTableName = "events"; // ClickHouse 日志表的名称
-
-// MongoDB connection
-connectToDatabase();
-
-// Redis client
-// Using the modern 'redis' package client setup
-const redisClient = createClient({ url: redisUri }); // 👈 使用解构后的 createClient
-
-redisClient.on("connect", () => console.log("Connected to Redis"));
-redisClient.on("error", (err: any) => console.error("Redis connection error:", err));
-
-// Connect to Redis when the application starts
-(async () => {
-  try {
-    await redisClient.connect();
-    // 确保 ClickHouse 表在应用启动时存在
-    await clickhouseService.ensureTable(clickhouseTableName);
-  } catch (err) {
-    console.error("Failed to connect to essential services:", err);
-    process.exit(1); // 如果连接失败,退出应用
-  }
-})();
 
 // Middleware
-
-// 服务部署在反向代理(如 Nginx)后面,需设置此项以正确获取客户端 IP
 app.set("trust proxy", true);
-
 app.use(express.json());
 
-// 新增中间件:为每个API请求添加日志打印
-app.use((req: Request, res: Response, next: NextFunction) => {
-  console.log(`[API Request] ${new Date().toISOString()} - ${req.method} ${req.originalUrl}`);
-  next();
-});
-
 // API routes
 app.use("/api", apiRoutes);
 
-// 动态设置公共目录和Angular应用路径
+// Static and SPA routing... (Keep your existing code here)
 let publicPath: string;
 let angularAppPath: string;
-
 if (process.env.NODE_ENV === "production") {
-  // 如果在生产环境中,从 dist 目录往上一层找到 public
   publicPath = path.resolve(__dirname, "..", "..", "public");
   angularAppPath = path.join(publicPath, "app");
 } else {
-  // 如果在开发环境中,public 目录就在当前目录的上一层(相对于src)
   publicPath = path.resolve(__dirname, "..", "public");
   angularAppPath = path.join(publicPath, "app");
 }
-
 console.log(process.env.NODE_ENV);
 console.log(`publicPath: ${publicPath}`);
 console.log(`angularAppPath: ${angularAppPath}`);
-
-// 服务 Angular 应用的静态文件
-// Express 会在 public 目录下寻找请求的静态文件,如 /app/main.js
 app.use(express.static(publicPath));
-
-// 作为最终的备用,处理所有未被前面路由处理的请求
-// 这是最标准的单页面应用(SPA)路由处理方式
 app.use((req: Request, res: Response) => {
   res.sendFile(path.join(angularAppPath, "index.html"));
 });
 
 // Start the server
-app.listen(port, () => {
-  console.log(`OMS Backend server listening on port ${port}`);
-});
+async function startServer() {
+  await initializeClients(); // 先初始化所有客户端
+  const server = http.createServer(app);
+  // server.keepAliveTimeout = 61 * 1000;
+  // server.headersTimeout = 65 * 1000;
+  server.listen(port, () => {
+    console.log(`OMS Backend server listening on port ${port}`);
+  });
+}
+
+startServer();
 
-// Export services/clients for use in other modules if needed
-export { redisClient, clickhouseService }; // 👈 导出 ClickhouseService
+// Export services/clients if needed by other modules
+export { redisClient, clickhouseService };

+ 37 - 0
oms/src/services/clients.ts

@@ -0,0 +1,37 @@
+import { createClient } from "redis";
+import { ClickhouseService } from "./clickhouseService";
+import { connectToDatabase } from "../database";
+
+// ClickHouse settings
+const clickhouseHost = process.env.CLICKHOUSE_HOST || "http://localhost:8123";
+const clickhouseDatabase = process.env.CLICKHOUSE_DATABASE || "omsdb";
+const clickhouseUser = process.env.CLICKHOUSE_USER;
+const clickhousePassword = process.env.CLICKHOUSE_PASSWORD;
+
+// MongoDB connection
+connectToDatabase();
+
+// Redis client
+const redisUri = process.env.REDIS_URI || "redis://redis:6379";
+const redisClient = createClient({ url: redisUri });
+redisClient.on("connect", () => console.log("Connected to Redis"));
+redisClient.on("error", (err: any) => console.error("Redis connection error:", err));
+
+// Clickhouse client
+const clickhouseService = new ClickhouseService(clickhouseHost, clickhouseDatabase, clickhouseUser, clickhousePassword);
+const clickhouseTableName = "events";
+
+// Initialize essential services
+export async function initializeClients() {
+  try {
+    await redisClient.connect();
+    await clickhouseService.ensureTable(clickhouseTableName);
+    console.log("[Clients] All essential services connected successfully.");
+  } catch (err) {
+    console.error("[Clients] Failed to connect to essential services:", err);
+    process.exit(1);
+  }
+}
+
+// Export the initialized clients
+export { redisClient, clickhouseService };