153 lines
4.5 KiB
TypeScript
153 lines
4.5 KiB
TypeScript
import { Router, Request, Response } from 'express'
|
||
import axios from 'axios'
|
||
import { authMiddleware } from '../middleware/authMiddleware'
|
||
import * as dotenv from 'dotenv'
|
||
|
||
// 加载环境变量
|
||
dotenv.config()
|
||
|
||
const router = Router()
|
||
|
||
// 游戏服务端API基础URL
|
||
const GAME_API_URL = process.env.GAME_API_URL || 'http://127.0.0.1:8080/tool/http'
|
||
|
||
// 检查游戏服务状态
|
||
router.get('/status', authMiddleware, async (req: Request, res: Response) => {
|
||
try {
|
||
// 获取PSK密钥
|
||
const GAME_PSK = process.env.GAME_PSK
|
||
if (!GAME_PSK) {
|
||
return res.status(500).json({
|
||
success: false,
|
||
message: '游戏服务端PSK密钥未配置'
|
||
})
|
||
}
|
||
|
||
// 发送测试请求到游戏服务端API
|
||
const response = await axios.post(GAME_API_URL, { code: 'account/get_account_list', page: 1, pageSize: 1 }, {
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'psk': GAME_PSK // 添加PSK认证头
|
||
},
|
||
timeout: 5000, // 设置5秒超时
|
||
proxy: false // 禁用代理,确保请求直接发送到目标服务器
|
||
})
|
||
|
||
return res.status(200).json({
|
||
success: true,
|
||
message: '游戏服务端连接成功',
|
||
data: {
|
||
status: 'online',
|
||
responseTime: response.config.timeout
|
||
}
|
||
})
|
||
} catch (error: unknown) {
|
||
console.error('游戏服务状态检查失败:', error)
|
||
|
||
if (axios.isAxiosError(error)) {
|
||
// Axios错误处理
|
||
if (error.code === 'ECONNREFUSED') {
|
||
return res.status(200).json({
|
||
success: false,
|
||
message: '游戏服务端连接失败',
|
||
data: {
|
||
status: 'offline',
|
||
error: '游戏服务端未响应,请检查游戏服务端是否正常运行'
|
||
}
|
||
})
|
||
} else if (error.code === 'ECONNABORTED') {
|
||
return res.status(200).json({
|
||
success: false,
|
||
message: '游戏服务端请求超时',
|
||
data: {
|
||
status: 'timeout',
|
||
error: '游戏服务端响应超时'
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
return res.status(200).json({
|
||
success: false,
|
||
message: '游戏服务端状态检查失败',
|
||
data: {
|
||
status: 'error',
|
||
error: '未知错误'
|
||
}
|
||
})
|
||
}
|
||
})
|
||
|
||
// 转发请求到游戏服务端API(需要认证)
|
||
router.post('/', authMiddleware, async (req: Request, res: Response) => {
|
||
try {
|
||
// 获取游戏服务端API路径和参数
|
||
const { path, params } = req.body
|
||
|
||
if (!path) {
|
||
return res.status(400).json({
|
||
success: false,
|
||
message: '缺少游戏服务端API路径'
|
||
})
|
||
}
|
||
|
||
// 获取PSK密钥
|
||
const GAME_PSK = process.env.GAME_PSK
|
||
if (!GAME_PSK) {
|
||
return res.status(500).json({
|
||
success: false,
|
||
message: '游戏服务端PSK密钥未配置'
|
||
})
|
||
}
|
||
|
||
// 构建完整的请求URL
|
||
const apiUrl = `${GAME_API_URL}`
|
||
|
||
// 发送请求到游戏服务端API(禁用代理,确保直接连接)
|
||
const response = await axios.post(apiUrl, { code: path, ...params }, {
|
||
headers: {
|
||
'Content-Type': 'application/json',
|
||
'psk': GAME_PSK // 添加PSK认证头
|
||
},
|
||
timeout: 10000, // 设置10秒超时
|
||
proxy: false // 禁用代理,确保请求直接发送到目标服务器
|
||
})
|
||
|
||
// 返回游戏服务端API的响应
|
||
res.status(200).json({
|
||
success: true,
|
||
message: '游戏服务端API调用成功',
|
||
data: response.data
|
||
})
|
||
} catch (error: unknown) {
|
||
console.error('游戏服务端API调用失败:', error)
|
||
|
||
if (axios.isAxiosError(error)) {
|
||
// Axios错误处理
|
||
if (error.code === 'ECONNREFUSED') {
|
||
return res.status(503).json({
|
||
success: false,
|
||
message: '游戏服务端连接失败,请检查游戏服务端是否正常运行'
|
||
})
|
||
} else if (error.code === 'ECONNABORTED') {
|
||
return res.status(504).json({
|
||
success: false,
|
||
message: '游戏服务端API请求超时'
|
||
})
|
||
}
|
||
|
||
return res.status(error.response?.status || 500).json({
|
||
success: false,
|
||
message: error.response?.data?.message || '游戏服务端API调用失败',
|
||
data: error.response?.data
|
||
})
|
||
}
|
||
|
||
res.status(500).json({
|
||
success: false,
|
||
message: '游戏服务端API调用失败,请稍后重试'
|
||
})
|
||
}
|
||
})
|
||
|
||
export default router |