Я создал многопользовательскую онлайн-игру, где бэкэнд - это 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)
Я использую socket.io с экспресс.В моем коде нет ничего общего с zlib, и это единственные npm-зависимости, которые я использую.
A очень сокращенная версия кода, который я использую (который в идеале долженне были переданы в любой форме):
//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"
.