首页 > 解决方案 > 使用带有快递的帖子:我想从用户那里接收数据,然后使用新文件将该数据发送回用户

问题描述

我正在创建一个桌面纸牌游戏的 node.js 网页,我最初在后端构建了应用程序,同时一次只能处理一个游戏(因为我一次只测试一个)。既然我正在合并前端,并且需要一次处理多个游戏的能力,我正在努力解决如何接收用户的姓名和 ID 代码并创建或加入特定游戏,同时仍然记住客户端玩家自己是谁:

早期算法:

-- 拥有全局变量 player 并使用 post req 更新到用户输入的名称(通过 express)。

--发送用户gameView.html文件

--从那里(客户端) const socket = io.connect(), socket.emit('newPlayer', socket.id)

--创建一个连接socket id和全局变量player的播放器对象

--将全局播放器变量重置为“”

--继续等待其他玩家

显然这是非常草率的做法,仅用于后端的开发。现在我需要处理多个用户和游戏,我的算法(理想情况下)可以这样工作:

--用户通过 prePlayView.html 文件发布他们的姓名和 id 代码

--向用户发送gameView.html文件以及输入的名称和ID(这是我不确定如何实现的部分,因为在发送新文件后套接字ID发生了变化,因此无法在服务器端进行跟踪)

-- 在客户端, const socket = io.connect(), socket.emit('newPlayer', name, id);

--如果 id 为空,则创建具有唯一 id 的游戏对象并存储在具有键 id 的游戏字典中并添加玩家

有任何想法吗?我从根本上错过了什么吗?我对 node.js 相当陌生。

这是我当前的实现供参考:

var app = express();
app.set('port', 5000);
// called when a player enters the game
app.post("/userView.html", function(req, res) {
  var body = "";
  req.on('data', function(char) {
    body += char;
  });

  req.on('end', function () {
    var playerName = body.substr(body.indexOf("=") + 1, body.indexOf("&") - 4);
    var id = body.substr(body.indexOf("&") + 4, body.length);
    body = "";
    var options = {
      headers: {
        'id': id,
        'names': playerName
      }
    }
    res.sendFile(path.join(__dirname, 'userView.html'), options);

  });

标签: javascriptjquerynode.jssocketspost

解决方案


我将假设您正在使用套接字在服务器和客户端之间进行通信。

没错,如果您想一次处理多个游戏,则不能在服务器上使用全局变量来存储当前注册用户的详细信息。使用这种策略,一次只有一个玩家可以在服务器上注册。

更好的策略是记住哪些客户端过去连接到服务器,以及当他们发出请求时,仅在请求期间临时加载其信息,并且仅在服务器的快速路由处理程序范围内。

我很高兴向您介绍会话的概念。您可以使用它们来记住有关先前连接的客户端的信息。有一个将会话添加到 express 的中间件,称为express-sessions。此外,假设您使用的是 sockets.io,还有一个关于使用 socket.io 和 express-session的常见问题解答。

我无法涵盖必须在此处更改架构以同时支持多个游戏的所有内容,但学习和利用会话是一种可能的途径。请慢慢来,一次咬下一块。学习如何构建网络应用程序来做你想象的事情可能很困难,一次只关注一个步骤是必要的:)


推荐阅读