node.js - 将共享对象附加到Socket.io Room

标签 node.js sockets redis socket.io socket.io-redis

我正在创建一个多人游戏,可以有许多游戏室,我想关联一个游戏对象(或游戏状态)每个房间;我使用nodejs,socket.io,socket.io-redis(不确定是否需要这个)。
更清楚地说,我也在用打字稿。
我尝试过使用socket.io redis的remoteJoin()功能,并成功地使用
io.of('/').adapter.rooms[<roomId>].game = Game
但是,我读到,这不是设置房间范围对象的正确方法。
用于创建房间的事件

socket.on('create-game', (createData: any) => {
    this.io.of('/').adapter.remoteJoin(socket.id, createData.roomId, (err: any) => {
        let player = new Player(createData.username)
        let game = new Game(createData.roomId)

        game.addPlayer(player)

        this.io.of('/').adapter.rooms[createData.roomId].game = game
    })
})

入室活动
socket.on('join-game', (joinData: any) => {
    this.io.of('/').adapter.remoteJoin(socket.id, joinData.roomId, (err: any) => {
        let player = new Player(joinData.username)
        let game = this.io.of('/').adapter.rooms[joinData.roomId].game as Game

        game.addPlayer(player)
    })
})

create-game事件发生的情况:
输入的数据用于创建一个Player
和对象
然后将Game添加到player对象中
最后,将game对象添加到房间中
game事件发生的情况:
输入的数据用于创建一个join-game
通过从房间中检索对象来创建Player
Game添加到游戏对象
在无数天/周之后?在搜索中,我偶然发现了stackoverflow线程:socket.io, how to attach state to a socket room
这个答案的意思是基本上不要做我上面做的事情。
他们的建议是创建自己的数据结构(甚至不确定如何开始这样做)。
我发现say只是在服务器中创建一个全局变量的其他答案,但同样,其他人说这是一个糟糕的实践(我也这么认为)。
另一个流行的答案是将游戏存储在redis中,但是redis不能保存复杂的javascript对象。现在,redis可以通过player函数保存哈希数据,但我发现它不适用于像hmset()对象这样复杂的对象,也不适用于函数、构造函数和getter/setter。
另一个突出的答案是只在“回合”后将游戏存储到数据库,但是在我的例子中,一旦游戏结束,房间就关闭了,相关的游戏也被销毁了;我不需要在“保存游戏”的意义上坚持这个游戏。

最佳答案

这是个好问题!我也很好奇。有人知道答案吗?

关于node.js - 将共享对象附加到Socket.io Room,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57602278/

相关文章:

java - 从 TCP 套接字读取的最有效方法

C 网络编程错误,因为\n

java - 地址已在使用 : JVM_Bind but no process is listed using port with netstat

node.js - 运行任务时 Gulp 错误 : ENOENT, lstat

mysql - 如何使用 Node.js 创建与 mysql 的等待连接

ios - 以安全方式使用 websocket 的 Redis ios 客户端

java - Spring "cacheNames"不适用于 "key"

Redis v2.4.10 与 v3.0.7

javascript - 在 Windows 7 上安装 contextify 错误 : `gyp` failed with exit code: 2

node.js - Meteor客户端同步服务器数据库调用