【发布时间】:2019-03-27 00:53:12
【问题描述】:
我做了一个后端是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"。
【问题讨论】:
-
没有看到你的其余代码,我们只能评论孤立的错误,它只是告诉你
self._handle,不管它应该是什么,都不存在。虽然self存在,但.handle属性为空。 -
编辑:我正在使用带有 express 的 socket.io。我的代码中与 zlib 无关,这些是我使用的唯一 npm 依赖项。
-
我宁愿保持代码闭源,并且不知道导致这种情况发生的原因,我无法提供 sn-p,因为我不知道要提供哪些行。对不起。
-
那我们是不可能帮你的了。我们只会在黑暗中拍摄。如果您可以将问题提炼成一个小玩具项目并将其发布,我们可以为您提供帮助。否则你的问题离题而且太宽泛了。
-
因为
null(存储在self._handle中的值)没有指向函数的write属性。