为什么我的在线游戏在Node.js中出现此错误?

时间:2019-02-28 17:09:59

标签: node.js express socket.io

我制作了一个在线多人游戏,后端是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"

2 个答案:

答案 0 :(得分:1)

我们在同一时间范围内遇到了同样的问题。我们通过对核心节点库zlib的所有使用的依赖关系进行了全面查看...,发现自从看到问题以来,我们的dep列表中唯一发生变化的就是“ ws”节点模块。这是engine.io的依赖项,而这又是socket.io的依赖项。 https://github.com/socketio/engine.io/pull/564/commits/6a47059eb8164cdf4c6537a7fef6829c90a398f7 ^ boom,engine.io增加了3个主要版本,仅发布了一个次要版本。因此,如果您从socket.io 2.1.1-> 2.2.0颠簸过来,就可以选择它。这是因为在这些版本之间,他们碰到了engine.io dep来指向最新的次要版本: https://github.com/socketio/socket.io/commit/190d22b46e3c2ed18413458a2106322f8bac99f5

答案 1 :(得分:1)

我在Ubuntu上也遇到了同样的麻烦。但是在Mac上运行代码时,没有错误/错误。

事实证明,我忘记了确认在Ubuntu上运行的Node版本。事实证明,V8.x是Ubuntu仓库中最新版本的NodeJS。一旦我用NVM安装了LTS,该错误/错误也会立即在Ubuntu上消失。

对于可能犯同样错误的任何人,请先检查您的Node版本。