get_server_info.js 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. //获取玩家区服数据
  2. let mysql = require('mysql');
  3. let mysqlcn = require('../../terry/mysqlcn.js');
  4. let query = mysqlcn.query;
  5. let qs = require('querystring');
  6. let http = require('http');
  7. let express = require('express');
  8. let router = express.Router();
  9. const timeout = 5000; // 设置超时时间为 5000 毫秒(5 秒)
  10. // 创建一个封装 http 请求的 Promise
  11. function fetchDataFromServer(options, data) {
  12. return new Promise((resolve, reject) => {
  13. const req = http.request(options, (res) => {
  14. let data = '';
  15. res.on('data', (chunk) => {
  16. data += chunk;
  17. });
  18. res.on('end', () => {
  19. resolve(data);
  20. });
  21. });
  22. req.on('error', (e) => {
  23. reject(e);
  24. });
  25. req.write(data)
  26. req.end();
  27. });
  28. }
  29. // 创建一个超时的 Promise
  30. function timeoutPromise(ms) {
  31. return new Promise((_, reject) => {
  32. setTimeout(() => {
  33. reject(new Error('请求超时'));
  34. }, ms);
  35. });
  36. }
  37. // 从多个 URL 获取数据,处理超时
  38. async function fetchAllDataWithTimeout(args, vals, timeout) {
  39. const dataTable = new Array();
  40. const timeoutPromiseInstance = timeoutPromise(timeout);
  41. try {
  42. // 使用 Promise.race 处理超时
  43. for (let i = 0; i < vals.length; i++) {
  44. const url = vals[i];
  45. let data2game = JSON.stringify({
  46. "sid" : vals[i].id,
  47. "channel" : args.channel,
  48. "account" : args.account,
  49. })
  50. let opt = {
  51. method: "POST",
  52. host: vals[i].ip,
  53. port: vals[i].port,
  54. path: "/check_server",
  55. headers: {
  56. "Content-Type": 'application/json',
  57. "Content-Length": Buffer.byteLength(data2game, "utf8")
  58. }
  59. };
  60. dataTable[i] = {
  61. "server_id": vals[i].id,
  62. "server_name": vals[i].name,
  63. "state": 0,
  64. "ip": vals[i].ip,
  65. "port": vals[i].game,
  66. "create": false,
  67. }
  68. const fetchPromise = fetchDataFromServer(opt, data2game);
  69. try {
  70. // 使用 Promise.race 处理每个请求的超时
  71. const result = await Promise.race([fetchPromise, timeoutPromiseInstance]);
  72. console.log(result)
  73. if(result != "Not Found") {
  74. const obj = JSON.parse(result);
  75. if (obj.state == 0){
  76. dataTable[i].state = obj.open? 1:0
  77. dataTable[i].create = obj.create
  78. }
  79. }
  80. } catch(error) {
  81. console.log(error);
  82. }
  83. }
  84. return dataTable;
  85. } catch (error) {
  86. console.error('Error:', error);
  87. throw error; // 重新抛出错误以便调用者处理
  88. }
  89. }
  90. let server_query_info = function(args,res){
  91. let sql = "SELECT * FROM services";
  92. query(sql,function(qerr,vals,fields_){
  93. if (qerr==null){
  94. fetchAllDataWithTimeout(args, vals, timeout)
  95. .then((dataTable) => {
  96. let returndata = JSON.stringify({
  97. 'code': 0,
  98. 'msg': "",
  99. 'data': dataTable,
  100. });
  101. res.send(returndata);
  102. }).catch((error) => {
  103. console.error('Error:', error);
  104. res.send(JSON.stringify({ 'code':'400','msg':'稍后请求'}));
  105. });
  106. }
  107. else{
  108. console.log("打开mysql库中服务器列表失败");
  109. try{
  110. res.send(JSON.stringify({ 'code':'400','msg':'稍后请求'}));
  111. }
  112. catch(e){}
  113. }
  114. });
  115. }
  116. router.post('/server_query_info', (req, res) => {
  117. // 解析请求体中的数据
  118. server_query_info(req.body, res)
  119. });
  120. module.exports = router;