|
@@ -1,57 +1,137 @@
|
|
|
//获取玩家区服数据
|
|
|
-var mysql = require('mysql');
|
|
|
-var mysqlcn = require('../../terry/mysqlcn.js');
|
|
|
-var query = mysqlcn.query;
|
|
|
-var qs = require('querystring');
|
|
|
-var encryption = require('../ordinary/encryption.js');
|
|
|
-var http = require('http');
|
|
|
+let mysql = require('mysql');
|
|
|
+let mysqlcn = require('../../terry/mysqlcn.js');
|
|
|
+let query = mysqlcn.query;
|
|
|
+let qs = require('querystring');
|
|
|
+let http = require('http');
|
|
|
|
|
|
-var express = require('express');
|
|
|
-var router = express.Router();
|
|
|
+let express = require('express');
|
|
|
+let router = express.Router();
|
|
|
|
|
|
+const timeout = 5000; // 设置超时时间为 5000 毫秒(5 秒)
|
|
|
|
|
|
-var server_query_info = function(args,res){
|
|
|
- var sql = "SELECT * FROM services";
|
|
|
- query(sql,function(qerr,vals,fields_){
|
|
|
- if (qerr==null){
|
|
|
- len = vals.length
|
|
|
- var data = new Array()
|
|
|
- for (var i = 0;i < vals.length; ++i){
|
|
|
- console.log("查询服务器id:%s",vals[i].id);
|
|
|
- // get_player_uid(vals[i],channel,account,vals[i].id,add_server);
|
|
|
- data[i] = {
|
|
|
- "server_id": vals[i].id,
|
|
|
- "server_name": vals[i].name,
|
|
|
+// 创建一个封装 http 请求的 Promise
|
|
|
+function fetchDataFromServer(options, data) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const req = http.request(options, (res) => {
|
|
|
+ let data = '';
|
|
|
+
|
|
|
+ res.on('data', (chunk) => {
|
|
|
+ data += chunk;
|
|
|
+ });
|
|
|
+
|
|
|
+ res.on('end', () => {
|
|
|
+ resolve(data);
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ req.on('error', (e) => {
|
|
|
+ reject(e);
|
|
|
+ });
|
|
|
+ req.write(data)
|
|
|
+ req.end();
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 创建一个超时的 Promise
|
|
|
+function timeoutPromise(ms) {
|
|
|
+ return new Promise((_, reject) => {
|
|
|
+ setTimeout(() => {
|
|
|
+ reject(new Error('请求超时'));
|
|
|
+ }, ms);
|
|
|
+ });
|
|
|
+}
|
|
|
+
|
|
|
+// 从多个 URL 获取数据,处理超时
|
|
|
+async function fetchAllDataWithTimeout(args, vals, timeout) {
|
|
|
+ const dataTable = new Array();
|
|
|
+ const timeoutPromiseInstance = timeoutPromise(timeout);
|
|
|
+ try {
|
|
|
+ // 使用 Promise.race 处理超时
|
|
|
+ for (let i = 0; i < vals.length; i++) {
|
|
|
+ const url = vals[i];
|
|
|
+ let data2game = JSON.stringify({
|
|
|
+ "sid" : vals[i].id,
|
|
|
+ "channel" : args.channel,
|
|
|
+ "account" : args.account,
|
|
|
+ })
|
|
|
+
|
|
|
+ let opt = {
|
|
|
+ method: "POST",
|
|
|
+ host: vals[i].ip,
|
|
|
+ port: vals[i].port,
|
|
|
+ path: "/check_server",
|
|
|
+ headers: {
|
|
|
+ "Content-Type": 'application/json',
|
|
|
+ "Content-Length": Buffer.byteLength(data2game, "utf8")
|
|
|
+ }
|
|
|
+ };
|
|
|
+ dataTable[i] = {
|
|
|
+ "server_id": vals[i].id,
|
|
|
+ "server_name": vals[i].name,
|
|
|
+ "state": 0,
|
|
|
+ "ip": vals[i].ip,
|
|
|
+ "port": vals[i].game,
|
|
|
+ "create": false,
|
|
|
+ }
|
|
|
+ const fetchPromise = fetchDataFromServer(opt, data2game);
|
|
|
+ try {
|
|
|
+ // 使用 Promise.race 处理每个请求的超时
|
|
|
+ const result = await Promise.race([fetchPromise, timeoutPromiseInstance]);
|
|
|
+ console.log(result)
|
|
|
+ if(result != "Not Found") {
|
|
|
+ const obj = JSON.parse(result);
|
|
|
+ if (obj.state == 0){
|
|
|
+ dataTable[i].state = obj.open? 1:0
|
|
|
+ dataTable[i].create = obj.create
|
|
|
+ }
|
|
|
}
|
|
|
- console.log("写入查询服务器id:%s",vals[i].id);
|
|
|
+ } catch(error) {
|
|
|
+ console.log(error);
|
|
|
}
|
|
|
- var returndata = JSON.stringify({
|
|
|
- 'code': 0,
|
|
|
- 'msg': "",
|
|
|
- 'data': data,
|
|
|
+ }
|
|
|
+
|
|
|
+ return dataTable;
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Error:', error);
|
|
|
+ throw error; // 重新抛出错误以便调用者处理
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+let server_query_info = function(args,res){
|
|
|
+ let sql = "SELECT * FROM services";
|
|
|
+ query(sql,function(qerr,vals,fields_){
|
|
|
+ if (qerr==null){
|
|
|
+ fetchAllDataWithTimeout(args, vals, timeout)
|
|
|
+ .then((dataTable) => {
|
|
|
+ let returndata = JSON.stringify({
|
|
|
+ 'code': 0,
|
|
|
+ 'msg': "",
|
|
|
+ 'data': dataTable,
|
|
|
+ });
|
|
|
+ res.send(returndata);
|
|
|
+ }).catch((error) => {
|
|
|
+ console.error('Error:', error);
|
|
|
+ res.send(JSON.stringify({ 'code':'400','msg':'稍后请求'}));
|
|
|
});
|
|
|
- console.log("查找mysql玩家角色服务器列表:%s",returndata);
|
|
|
- res.send(returndata);
|
|
|
- }else{
|
|
|
+
|
|
|
+ }
|
|
|
+ else{
|
|
|
console.log("打开mysql库中服务器列表失败");
|
|
|
try{
|
|
|
- res.send(JSON.stringify({ 'status':'400','msg':'稍后请求'}));
|
|
|
+ res.send(JSON.stringify({ 'code':'400','msg':'稍后请求'}));
|
|
|
}
|
|
|
catch(e){}
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
|
|
|
-//获取服务器列表
|
|
|
-router.get('/server_query_info', function(req, res) {
|
|
|
- try{
|
|
|
- console.log("[服务器列表查询] get server_query_info,host:%s, ip:%s,time:%s",req.hostname,req.ip,new Date());
|
|
|
- server_query_info(req.query,res);
|
|
|
- }catch(err){
|
|
|
- console.log(err);
|
|
|
- var info = JSON.stringify({ 'state':'0'});
|
|
|
- res.send(info);
|
|
|
- }
|
|
|
-})
|
|
|
+
|
|
|
+router.post('/server_query_info', (req, res) => {
|
|
|
+ // 解析请求体中的数据
|
|
|
+ server_query_info(req.body, res)
|
|
|
+});
|
|
|
|
|
|
module.exports = router;
|