From e0ca3a5d1227cb69a567015619cc01e4772798e5 Mon Sep 17 00:00:00 2001 From: wanglin2 <1013335014@qq.com> Date: Wed, 9 Apr 2025 22:25:42 +0800 Subject: [PATCH] =?UTF-8?q?Fix:ai=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=A2=AB=E5=8D=A0=E7=94=A8=E5=90=8E=E4=B8=8D=E5=90=AF=E5=8A=A8?= =?UTF-8?q?,=E9=81=BF=E5=85=8D=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- simple-mind-map/package-lock.json | 4 +- web/package-lock.json | 11 +-- web/scripts/ai.js | 116 ++++++++++++++++++------------ 3 files changed, 80 insertions(+), 51 deletions(-) diff --git a/simple-mind-map/package-lock.json b/simple-mind-map/package-lock.json index 7e18d130..4e66c5eb 100644 --- a/simple-mind-map/package-lock.json +++ b/simple-mind-map/package-lock.json @@ -1,11 +1,11 @@ { "name": "simple-mind-map", - "version": "0.12.1", + "version": "0.14.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "0.12.1", + "version": "0.14.0", "license": "MIT", "dependencies": { "@svgdotjs/svg.js": "3.2.0", diff --git a/web/package-lock.json b/web/package-lock.json index d60cc78c..dee9559d 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -15699,8 +15699,7 @@ "node_modules/viewerjs": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.6.tgz", - "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==", - "peer": true + "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==" }, "node_modules/vm-browserify": { "version": "1.1.2", @@ -19258,6 +19257,7 @@ "integrity": "sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==", "dev": true, "requires": { + "@babel/core": "^7.11.0", "@babel/helper-compilation-targets": "^7.9.6", "@babel/helper-module-imports": "^7.8.3", "@babel/plugin-proposal-class-properties": "^7.8.3", @@ -19270,6 +19270,7 @@ "@vue/babel-plugin-jsx": "^1.0.3", "@vue/babel-preset-jsx": "^1.2.4", "babel-plugin-dynamic-import-node": "^2.3.3", + "core-js": "^3.6.5", "core-js-compat": "^3.6.5", "semver": "^6.1.0" } @@ -29565,7 +29566,8 @@ "resolved": "https://registry.npmjs.org/v-viewer/-/v-viewer-1.7.4.tgz", "integrity": "sha512-K3PQ8utnVXXBCa5IRXRAhk/m83fNIsK77gTSXqAmPJe8eDTaSY1nifAOWPUmQDjzuCxYfa14UjGftHR9MFV70Q==", "requires": { - "lodash-es": "^4.17.21" + "lodash-es": "^4.17.21", + "viewerjs": "^1.11.6" } }, "v8-compile-cache": { @@ -29630,8 +29632,7 @@ "viewerjs": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/viewerjs/-/viewerjs-1.11.6.tgz", - "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==", - "peer": true + "integrity": "sha512-TlhdSp2oEOLFXvEp4psKaeTjR5zBjTRcM/sHUN8PkV1UWuY8HKC8n7GaVdW5Xqnwdr/F1OmzLik1QwDjI4w/nw==" }, "vm-browserify": { "version": "1.1.2", diff --git a/web/scripts/ai.js b/web/scripts/ai.js index c33b7ad0..7ed0cba0 100644 --- a/web/scripts/ai.js +++ b/web/scripts/ai.js @@ -1,53 +1,81 @@ const express = require('express') const axios = require('axios') +const net = require('net') const port = 3456 -// 起个服务 -const app = express() -app.use(express.json()) -app.use(express.urlencoded({ extended: true })) - -// 允许跨域 -app.use((req, res, next) => { - res.header('Access-Control-Allow-Origin', '*') // 允许所有来源的跨域请求,或者指定一个域名 - res.header('Access-Control-Allow-Methods', '*') // 允许的方法 - res.header('Access-Control-Allow-Headers', '*') // 允许的头部信息 - next() -}) - -// 监听对话请求 -app.get('/ai/test', (req, res) => { - res - .json({ - code: 0, - data: null, - msg: '连接成功' +const isPortUsed = port => { + return new Promise(resolve => { + const server = net.createServer() + server.once('error', err => { + if (err.code === 'EADDRINUSE') { + resolve(true) // 端口被占用 + } else { + resolve(false) // 其他错误 + } }) - .end() -}) -app.post('/ai/chat', async (req, res, next) => { - // 设置SSE响应头 - res.setHeader('Content-Type', 'text/event-stream') - res.setHeader('Cache-Control', 'no-cache') - res.setHeader('Connection', 'keep-alive') - - const { api, method = 'POST', headers = {}, data } = req.body - - try { - const response = await axios({ - url: api, - method, - headers, - data, - responseType: 'stream' + server.once('listening', () => { + server.close(() => resolve(false)) // 端口可用 }) - response.data.pipe(res) - } catch (error) { - next(error) + server.listen(port) // 尝试监听端口 + }) +} + +const createServe = () => { + // 起个服务 + const app = express() + app.use(express.json()) + app.use(express.urlencoded({ extended: true })) + + // 允许跨域 + app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*') // 允许所有来源的跨域请求,或者指定一个域名 + res.header('Access-Control-Allow-Methods', '*') // 允许的方法 + res.header('Access-Control-Allow-Headers', '*') // 允许的头部信息 + next() + }) + + // 监听对话请求 + app.get('/ai/test', (req, res) => { + res + .json({ + code: 0, + data: null, + msg: '连接成功' + }) + .end() + }) + app.post('/ai/chat', async (req, res, next) => { + // 设置SSE响应头 + res.setHeader('Content-Type', 'text/event-stream') + res.setHeader('Cache-Control', 'no-cache') + res.setHeader('Connection', 'keep-alive') + + const { api, method = 'POST', headers = {}, data } = req.body + + try { + const response = await axios({ + url: api, + method, + headers, + data, + responseType: 'stream' + }) + response.data.pipe(res) + } catch (error) { + next(error) + } + }) + + app.listen(port, () => { + console.log(`app listening on port ${port}`) + }) +} + +isPortUsed(port).then(isUsed => { + if (isUsed) { + console.error('端口被占用') + } else { + createServe() } }) - -app.listen(port, () => { - console.log(`app listening on port ${port}`) -})