|
|
@@ -0,0 +1,111 @@
|
|
|
+
|
|
|
+import express from 'express';
|
|
|
+import { readFileSync } from 'node:fs';
|
|
|
+
|
|
|
+const Parse = require('parse');
|
|
|
+
|
|
|
+Parse.initialize('hb-voc');
|
|
|
+
|
|
|
+Parse.serverURL = 'http://hb-server.fmode.cn/parse';
|
|
|
+
|
|
|
+Parse.masterKey = 'hb2026pallt';
|
|
|
+
|
|
|
+// @ts-ignore
|
|
|
+globalThis.Parse = Parse;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+// 获取配置
|
|
|
+function getConfig() {
|
|
|
+ try {
|
|
|
+ const configPath = process.env.NODE_ENV === 'test' ? './config.test.json' : './config.json';
|
|
|
+ const configContent = readFileSync(configPath, 'utf-8');
|
|
|
+ return JSON.parse(configContent);
|
|
|
+ } catch (error: unknown) {
|
|
|
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
|
+ console.warn('Config file not found, using defaults:', errorMessage);
|
|
|
+ return {
|
|
|
+ parse: {
|
|
|
+ port: 10003,
|
|
|
+ appId: 'hb-voc',
|
|
|
+ serverURL: 'http://hb-server.fmode.cn/parse'
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 初始化 Express 应用
|
|
|
+const app = express();
|
|
|
+
|
|
|
+// 中间件配置
|
|
|
+app.use(express.json());
|
|
|
+app.use(express.urlencoded({ extended: true }));
|
|
|
+// 日志中间件
|
|
|
+app.use((req: any, res: any, next: () => void) => {
|
|
|
+ console.log(`[${new Date().toISOString()}] ${req.method} ${req.path}`);
|
|
|
+ next();
|
|
|
+});
|
|
|
+
|
|
|
+// 健康检查端点
|
|
|
+app.get('/health', (req: any, res: any) => {
|
|
|
+ res.json({
|
|
|
+ status: 'healthy',
|
|
|
+ timestamp: new Date().toISOString(),
|
|
|
+ uptime: process.uptime()
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+// 根路由
|
|
|
+app.get('/', (req: any, res: any) => {
|
|
|
+ res.json({
|
|
|
+ message: 'Fmode Server - Gongzuo API',
|
|
|
+ version: '1.0.0',
|
|
|
+ timestamp: new Date().toISOString(),
|
|
|
+ endpoints: ['/api', '/health']
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+// 404 处理
|
|
|
+app.use((req: any, res: any) => {
|
|
|
+ res.status(404).json({
|
|
|
+ message: 'Not Found',
|
|
|
+ path: req.path,
|
|
|
+ method: req.method
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+// 错误处理中间件
|
|
|
+app.use((err: any, req: any, res: any, next: any) => {
|
|
|
+ console.error('Error:', err);
|
|
|
+ res.status(500).json({
|
|
|
+ message: 'Internal Server Error',
|
|
|
+ error: err.message
|
|
|
+ });
|
|
|
+});
|
|
|
+
|
|
|
+// 启动服务器
|
|
|
+async function startServer() {
|
|
|
+ const config = getConfig();
|
|
|
+ const PORT = process.env.PORT || config.parse?.port || 3000;
|
|
|
+ app.listen(PORT, () => {
|
|
|
+ console.log('\n' + '='.repeat(60));
|
|
|
+ console.log('🚀 Fmode Server - MSQ Started');
|
|
|
+ console.log('='.repeat(60));
|
|
|
+ console.log(`Timestamp: ${new Date().toISOString()}`);
|
|
|
+ console.log('='.repeat(60) + '\n');
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 优雅关闭
|
|
|
+process.on('SIGTERM', () => {
|
|
|
+ console.log('\n📛 SIGTERM signal received: closing HTTP server');
|
|
|
+ process.exit(0);
|
|
|
+});
|
|
|
+
|
|
|
+process.on('SIGINT', () => {
|
|
|
+ console.log('\n📛 SIGINT signal received: closing HTTP server');
|
|
|
+ process.exit(0);
|
|
|
+});
|
|
|
+
|
|
|
+// 启动服务器
|
|
|
+await startServer();
|