为什么我在 Node.js 中玩在线游戏时会出现此错误?
我制作了一个在线多人游戏,后端是 nodejs,有时当人们测试它时,他们会发送大量子弹或使用脚本创建大量玩家,我会收到错误。我对此有限制,因此游戏中只能有 500 个子弹和 20 个玩家,他们最终都会消失,但即使它不让人们创建太多子弹/玩家,当他们尝试时,我也会收到此错误:
zlib.js:499
var newReq = self._handle.write(flushFlag,
^
TypeError: Cannot read property 'write' of null
at Zlib.callback (zlib.js:499:33)
我正在使用带有 express 的 socket.io。我的代码中与 zlib 无关,这些是我正在使用的唯一 npm 依赖项。
我正在使用的代码的一个 非常 精简版本(理想情况下不应以任何形式共享):
//Dependencies
var express = require("express");
var app = express();
var server = require('http').Server(app);
var io = require('socket.io')(server);
var fs = require('fs');
/* a bunch of vars + config */
//Express
server.listen(7654);
//Some functions
//Socket.io Listeners
io.on('connection', function(socket) {
//Declare Player
socket.on("declare player", function (data) {
if (Object.keys(players).length > maxPlayers) return; //Make sure no more than 20 players
//If statements to check valid data was sent
var playerdata = {
//Player Data
};
//Referral code stuff
//Secret Names
switch (playerdata.name) {
//Secret player codes for powerups
}
playerSecrets[data.id] = data.secret;
players[data.id] = playerdata;
});
//Player Action
socket.on("player action", function (data) {
/* Player controls input, mostly redacted */
switch (data.action.command) {
case "shoot": //Shoot Bullet
players[data.id].score--;
if (bullets.length > maxBullets) return; //Maximum Bullets in Arena (500)
bullets.push({/*bullet data*/});
break;
}
});
});
//Kill Player
function kill(playerid) {
delete players[playerid];
delete playerSecrets[playerid];
}
//Generate stars
//Game loop
setInterval(function () {
//Emit gamedata to clients
io.emit("gamedata", {
players: players,
stars: stars,
bullets: bullets,
referrals: referralData
});
//For each player
for (var i = 0; i < Object.keys(players).length; i++) {
//Redacted
}
//For each bullet
for (var i = 0; i < bullets.length; i++) {
//Redacted
}
}, 1000 / tickSpeed);
我想知道它是否与添加到 JSON/Arrays 的内容有关,因为当创建玩家/射出子弹时会发生这种情况,并且发送垃圾邮件会导致这种情况发生。请参阅
socket.on("player action"
和
socket.on("declare player"
。
我们在同一时间范围内遇到了同样的问题。我们全面检查了所有使用核心节点库 zlib 的依赖项……并发现自发现问题以来,依赖列表中唯一发生变化的是“ws”节点模块。这是 engine.io 的依赖项,而 engine.io 又是 socket.io 的依赖项。 https://github.com/socketio/engine.io/pull/564/commits/6a47059eb8164cdf4c6537a7fef6829c90a398f7 ^ boom,engine.io 将 ws 升级了 3 个主要版本,并且只发布了一个小版本。因此,如果您从 socket.io 2.1.1 升级到 2.2.0,则您会选择这个版本。这是因为在这两个版本之间,他们修改了 engine.io dep 以指向最新的次要版本: https://github.com/socketio/socket.io/commit/190d22b46e3c2ed18413458a2106322f8bac99f5
我在 Ubuntu 上遇到了同样的问题。但是在我的 Mac 上运行代码时没有错误/错误。
原来我忘记确认在 Ubuntu 上运行的 Node 版本。原来 V8.x 是 Ubuntu 存储库中 NodeJS 的最新版本。一旦我使用 NVM 安装 LTS,Ubuntu 上的错误/错误也立即消失了。
对于可能犯过同样错误的人,请先检查您的 Node 版本。