我的应用程序每秒进行一次查询,但有时查询需要超过一秒钟

时间:2016-01-18 18:13:36

标签: node.js

我目前正在制作一个小型nodejs应用程序来监控游戏服务器上的玩家数量。这是我的app.js

    var express = require('express');
var http = require('http');
var query = require('game-server-query');

var app = express();
var server = http.createServer(app);
var io = require('socket.io')(server);

function ping(callback) {
    query({
        type: 'arma3',
        host: 'xx.xxx.xxx.xxx'
      },
      function(state) {
        var num = state.raw.numplayers;
        callback(num);
      }
    );
  }

app.get('/', function(req, res) {
  ping(function(num) {
    res.render('index.ejs', {
      count: num
    });
  });
});


io.on('connection', function(socket) {
  socket.on('_pask', function () {
    ping(function(num) {
      socket.emit('_prefresh', num);
    });
  });
});

server.listen(8080);

这是我的客户档案:

    <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Data</title>
</head>
<body>
  <p>Players:
    <%= count %>
  </p>
  <script src="https://code.jquery.com/jquery-1.10.2.min.js"></script>
  <script src="/socket.io/socket.io.js"></script>
  <script>
    var socket = io.connect('http://localhost:8080');

    socket.on('_prefresh', function(num) {
      console.log(num);
    });

    setInterval(function() {
      socket.emit('_pask');
    }, 3000);
  </script>
</body>
</html>

所以基本上,有时,请求需要超过一秒钟,因此应用程序崩溃“无法读取未定义的属性'numplayers',我认为这意味着程序试图读取整数并且它无法读取它,因为查询尚未完成。 那么,有人可以帮助我吗?

2 个答案:

答案 0 :(得分:0)

在您的服务器代码上,仅在设置值时执行emit。

使用settimeout

每秒触发一次发射
setTimeout(function() {

   if (value!=null) {
       socket.emit HERE
   } else {
       console.log("not emitting coz value not set");
   }

}, 1000);

答案 1 :(得分:0)

这意味着state由于某种原因从后端变为undefined,请添加对state的检查。

function ping(callback) {
    query({
        type: 'arma3',
        host: 'xx.xxx.xxx.xxx'
      },
      function(state) {
        if(state !== undefined){
          var num = state.raw.numplayers;
          callback(num);
        }
      }
    );
  }