Files
MHXY_Web/backend/src/routes/game.routes.ts
2025-12-22 23:51:21 +08:00

153 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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