【问题标题】:Why do I get this error in Node.js for my online game?为什么我的在线游戏在 Node.js 中出现此错误?
【发布时间】: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属性。

标签: node.js express socket.io


【解决方案1】:

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

【讨论】:

  • 那么 engine.io(以及 socket.io)已经修复了这个错误?
  • 不,我们将 socket.io 恢复到以前的版本。无法始终如一地重现该问题,因此我认为目前 github 问题不会受到他们的喜爱。
  • 如果您能够在本地持续重现您的游戏,您打开的问题可能会引起他们的注意!
  • 我在socket.io: ^2.2.0engine.io: 3.3.2 (ws: ~6.1.0) 遇到了这个错误,我该怎么办?
  • package.json 中的线路更改为socket.io: 2.1.1。不要包含胡萝卜符号,否则会增加次要版本。 michaelsoolee.com/npm-package-tilde-caret
【解决方案2】:

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

原来我忘记确认在 Ubuntu 上运行的 Node 版本。原来是 V8.x 是 Ubuntu 存储库上最新版本的 NodeJS。一旦我用 NVM 安装了 LTS,错误/错误在 Ubuntu 上也立即消失了。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多