【问题标题】:How do I handle multiple write functions from a socket.io room `emit` event?如何处理来自 socket.io room `emit` 事件的多个写入函数?
【发布时间】:2021-05-10 03:07:33
【问题描述】:

首先要提供一些上下文。问题在底部。

背景

我正在制作一个基于浏览器的 javascript 游戏,用户可以在其中加入房间并四处移动瓷砖。游戏结束后,用户数据被发送到服务器,需要与其他用户数据进行合并,然后将生成的数据发送回每个用户,以显示其他玩家的结果。

我正在使用带有 socket.io 的 Express 节点服务器(前端是 react,fwiw)

手头的问题

我有一个游戏室的 json 文件,我们称之为1a2b.json

{
  "roomID":"1a2b",
  "users":[
    {
      "name":"username",
      "id": 123,
      "tiles":[
        {"char":"I","x":false,"y":false,"r":false,"id":"1"},
        {"char":"X","x":false,"y":false,"r":false,"id":"2"}
      ]
    }
    {
      "name":"username2",
      "id": 456,
      "tiles":[
        {"char":"V","x":false,"y":false,"r":false,"id":"3"},
        {"char":"K","x":false,"y":false,"r":false,"id":"4"}
      ]
    }
  ]
}

当游戏结束时,玩家会发出一个套接字事件 (game-end),该事件会发送更新的玩家 tiles 数据。比如:

{
  "name":"username",
  "id": 123,
  "roomID":"1a2b",
  "tiles":[
    {"char":"I","x":21,"y":30,"r":"45deg","id":"1"},
    {"char":"X","x":50,"y":80,"r":false,"id":"2"}
  ]
}

在服务器上,当观察到game-end 套接字事件时,我需要使用来自每个用户的新数据更新原始1a2b.json 文件,用新的@987654329 替换玩家的旧tiles 数据@数据。

所有用户将同时发出事件,我认为这会导致某些用户出现fs.writefile 错误。

问题

当多个更新/写入事件同时发生到同一个文件时,我如何处理更新和写入1a2b.json 的内容?在提议的解决方案中,是否有办法判断所有写入请求何时完成,以便我可以将完成的 json 文件中的数据发回给用户?

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

    如果您只运行一个 Express 实例,由于 Node 是单线程的,服务器一次只能处理一次写入。所以你不会遇到任何错误。

    真正的解决方案是写入数据库而不是文件。

    【讨论】:

      猜你喜欢
      • 2019-04-18
      • 1970-01-01
      • 2019-05-31
      • 1970-01-01
      • 2021-09-09
      • 2023-03-14
      • 2020-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多