Просмотр исходного кода

refactor(generateServer): 移除跨窗口服务器状态检查并优化启动逻辑

- 移除使用 localStorage 跨窗口共享服务器启动状态的功能
- 移除 isServerStarted 和 markServerStarted 辅助函数
- 修改服务器创建方式为先创建实例再监听端口
- 添加端口占用错误处理机制,避免重复启动错误
- 保持 500MB 请求体大小限制不变
- 优化服务器启动日志输出逻辑
panqiuyao 19 часов назад
Родитель
Сommit
8d5ebf8294
1 измененных файлов с 42 добавлено и 64 удалено
  1. 42 64
      frontend/src/utils/generateServer.ts

+ 42 - 64
frontend/src/utils/generateServer.ts

@@ -11,34 +11,9 @@ import pinia from "@/stores/index";
 // @ts-ignore - Node.js require 在Electron环境中可用
 type NodeRequire = typeof require
 
-// 使用 localStorage 来跨窗口共享服务器启动状态
-const SERVER_STARTED_KEY = 'generate_server_started'
-
-function isServerStarted(): boolean {
-  try {
-    return localStorage.getItem(SERVER_STARTED_KEY) === 'true'
-  } catch {
-    return false
-  }
-}
-
-function markServerStarted(): void {
-  try {
-    localStorage.setItem(SERVER_STARTED_KEY, 'true')
-  } catch {
-    // localStorage 不可用时的降级处理
-  }
-}
-
 export async function startGenerateServer( ) {
   setTimeout(() => {
 
-  // 检查服务器是否已在其他窗口启动
-  if (isServerStarted()) {
-    console.log('[generateServer] server already started in another window')
-    return
-  }
-
   // 仅在具有 Node 能力(Electron 渲染进程)时启动
   const nodeRequire: NodeRequire | undefined = (window as any)?.require
   if (!nodeRequire) {
@@ -49,48 +24,51 @@ export async function startGenerateServer( ) {
     const PORT = appConfig?.PORT || 3001
     const http = nodeRequire('http')
 
-    // 标记服务器已启动(使用 localStorage 跨窗口共享)
-    markServerStarted()
-
-  http
-    .createServer(async (req: any, res: any) => {
-      // 仅支持 POST /generate
-      if (req.method !== 'POST' || req.url !== '/generate') {
-        res.statusCode = 404
-        res.end('Not Found')
-        return
+  const server = http.createServer(async (req: any, res: any) => {
+    // 仅支持 POST /generate
+    if (req.method !== 'POST' || req.url !== '/generate') {
+      res.statusCode = 404
+      res.end('Not Found')
+      return
+    }
+
+    let body = ''
+    req.on('data', (chunk: any) => {
+      body += chunk
+
+      // 简单的大小保护(500MB)
+      if (body.length > 500 * 1024 * 1024) {
+        res.statusCode = 413
+        res.end('Payload Too Large')
+        req.destroy()
       }
-
-      let body = ''
-      req.on('data', (chunk: any) => {
-        body += chunk
-
-        // 简单的大小保护(50MB)
-        // 改成500
-        if (body.length > 500 * 1024 * 1024) {
-          res.statusCode = 413
-          res.end('Payload Too Large')
-          req.destroy()
-        }
-      })
-
-      req.on('end', async () => {
-        res.setHeader('Content-Type', 'application/json')
-        try {
-          const payload = body ? JSON.parse(body) : {}
-          const canvasList = payload.canvasList || []
-          const goodsList = payload.goodsList || []
-          const { images, plans } = await generateImagesBase64(canvasList, goodsList)
-          res.end(JSON.stringify({ code: 0, images, plans }))
-        } catch (e: any) {
-          res.statusCode = 500
-          res.end(JSON.stringify({ code: 1, msg: e?.message || 'generate failed' }))
-        }
-      })
     })
-    .listen(PORT, () => {
-      console.log(`[generateServer] listening on http://localhost:${PORT}/generate`)
+
+    req.on('end', async () => {
+      res.setHeader('Content-Type', 'application/json')
+      try {
+        const payload = body ? JSON.parse(body) : {}
+        const canvasList = payload.canvasList || []
+        const goodsList = payload.goodsList || []
+        const { images, plans } = await generateImagesBase64(canvasList, goodsList)
+        res.end(JSON.stringify({ code: 0, images, plans }))
+      } catch (e: any) {
+        res.statusCode = 500
+        res.end(JSON.stringify({ code: 1, msg: e?.message || 'generate failed' }))
+      }
     })
+  })
+
+  // 尝试启动服务器,如果端口被占用会自动失败
+  server.listen(PORT, () => {
+    console.log(`[generateServer] listening on http://localhost:${PORT}/generate`)
+  }).on('error', (err: any) => {
+    if (err.code === 'EADDRINUSE') {
+      console.log(`[generateServer] port ${PORT} already in use, skipping server start`)
+    } else {
+      console.error('[generateServer] server start failed:', err.message)
+    }
+  })
   }, 2000)
 }