2025-06-24 23:11:46 +08:00

82 lines
1.9 KiB
JavaScript

const express = require('express')
const axios = require('axios')
const net = require('net')
const port = 3456
const isPortUsed = port => {
return new Promise(resolve => {
const server = net.createServer()
server.once('error', err => {
if (err.code === 'EADDRINUSE') {
resolve(true) // 端口被占用
} else {
resolve(false) // 其他错误
}
})
server.once('listening', () => {
server.close(() => resolve(false)) // 端口可用
})
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()
}
})