Bladeren bron

✨ feat(server): 集成Socket.IO实现实时通信功能

- 修改package.json中的dev脚本入口为server2.js
- 导入并初始化Socket.IO服务器,支持实时双向通信
- 添加CORS中间件,解决跨域问题
- 实现开发/生产环境下Socket.IO中间件和路由的动态加载
- 增加Socket.IO路径配置和启动日志输出

♻️ refactor(server): 优化服务器配置和代码结构

- 统一代码格式化,调整缩进和空格
- 优化服务器实例创建代码的可读性
- 完善常量定义和日志输出信息
- 导出API路由,优化模块组织结构
yourname 6 maanden geleden
bovenliggende
commit
b88fc054d7
3 gewijzigde bestanden met toevoegingen van 80 en 7 verwijderingen
  1. 1 1
      package.json
  2. 75 6
      server2.js
  3. 4 0
      src/server/index.tsx

+ 1 - 1
package.json

@@ -4,7 +4,7 @@
   "version": "0.0.0",
   "type": "module",
   "scripts": {
-    "dev": "PORT=8080 node server",
+    "dev": "PORT=8080 node server2",
     "dev:stock": "PORT=8080 cross-env DEBUG=backend:* node server",
     "build": "npm run build:client && npm run build:server && npm run build:api",
     "build:client": "vite build --outDir dist/client --manifest",

+ 75 - 6
server2.js

@@ -3,17 +3,28 @@ import fs from 'node:fs/promises';
 import { URL } from 'node:url';
 import { Transform } from 'node:stream';
 import { Readable } from 'node:stream';
+import { pipeline } from 'node:stream/promises';
 import { Hono } from 'hono';
+import { cors } from 'hono/cors'
 import { logger } from 'hono/logger';
 import { createServer as createNodeServer } from 'node:http';
 import process from 'node:process';
-import { createAdaptorServer } from '@hono/node-server'  
+import { createAdaptorServer } from '@hono/node-server'
+// 新增:导入 Socket.IO
+import { Server } from 'socket.io';
 
 // 创建 Hono 应用
 const app = new Hono();
 
-// 全局使用 Hono 日志中间件
+// 全局使用 Hono 日志中间件(记录所有请求)
 app.use('*', logger());
+app.use('*', cors(
+  // {
+  //   origin: ['http://localhost:3000'],
+  //   allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
+  //   credentials: true
+  // }
+))
 
 // 常量定义
 const isProduction = process.env.NODE_ENV === 'production';
@@ -34,13 +45,27 @@ console.log(`基础URL解析完成: ${baseUrl.href}`);
 
 // 创建服务器实例
 console.log('正在创建服务器实例...');
-const parentServer = createAdaptorServer({  
-  fetch: app.fetch,  
-  createServer: createNodeServer,  
-  port: port,  
+const parentServer = createAdaptorServer({
+  fetch: app.fetch,
+  createServer: createNodeServer,
+  port: port,
 })
 console.log('服务器实例创建成功');
 
+// 新增:初始化 Socket.IO 服务器
+console.log('正在初始化 Socket.IO 服务器...');
+const io = new Server(parentServer, {
+  // // 配置 CORS,根据实际需求调整
+  // cors: {
+  //   origin: isProduction ? process.env.FRONTEND_URL || false : "http://localhost:8080",
+  //   methods: ["GET", "POST"],
+  //   credentials: true
+  // },
+  // // 路径配置,避免与其他路由冲突
+  // path: `${base}socket.io`
+});
+console.log('Socket.IO 服务器初始化完成');
+
 // 生产环境中间件
 let compressionMiddleware;
 let sirvMiddleware;
@@ -95,6 +120,49 @@ const processDevTemplate = async (template) => {
   return template;
 };
 
+// 新增:加载 Socket.IO 中间件和路由
+if (!isProduction) {
+  console.log('开发环境: 从 Vite 加载 Socket.IO 路由和中间件...');
+  try {
+    const socketModule = await vite.ssrLoadModule('./src/server/socket.ts');
+    
+    // 应用认证中间件
+    if (socketModule.authMiddleware) {
+      console.log('应用 Socket.IO 认证中间件');
+      io.use(socketModule.authMiddleware);
+    }
+    
+    // 应用路由
+    if (socketModule.default) {
+      console.log('注册 Socket.IO 路由处理');
+      socketModule.default(io);
+    }
+    console.log('Socket.IO 路由和中间件加载完成');
+  } catch (err) {
+    console.error('开发环境加载 Socket.IO 模块失败:', err);
+  }
+} else {
+  console.log('生产环境: 加载编译后的 Socket.IO 路由和中间件...');
+  try {
+    const socket = (await import('./dist/socket/socket.js')).default;
+    
+    // 应用认证中间件
+    if (socket.authMiddleware) {
+      console.log('应用 Socket.IO 认证中间件');
+      io.use(socket.authMiddleware);
+    }
+    
+    // 应用路由
+    if (socket.default) {
+      console.log('注册 Socket.IO 路由处理');
+      socket.default(io);
+    }
+    console.log('Socket.IO 路由和中间件加载完成');
+  } catch (err) {
+    console.error('加载 Socket.IO 模块失败:', err);
+  }
+}
+
 // 生产环境模板处理函数 - 仅处理资源路径替换
 const processProdTemplate = async (template) => {
   console.log('生产环境: 处理模板资源路径...');
@@ -310,6 +378,7 @@ parentServer.listen(port, () => {
   console.log('========================================');
   console.log(`服务器已成功启动!`);
   console.log(`访问地址: http://localhost:${port}`);
+  console.log(`Socket.IO 路径: ${base}socket.io`);
   console.log(`环境: ${isProduction ? '生产环境' : '开发环境'}`);
   console.log('========================================');
 })

+ 4 - 0
src/server/index.tsx

@@ -24,3 +24,7 @@ export const template = renderToStaticMarkup(
   <Rooter />
 );
 
+// 导出 API 路由
+export { default as api } from './api';
+
+