我目前正在制作一个小型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',我认为这意味着程序试图读取整数并且它无法读取它,因为查询尚未完成。 那么,有人可以帮助我吗?
答案 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);
}
}
);
}