node.js非阻塞POST请求等待另一个POST请求

所以我正在开发一个基于文本的游戏,在这个游戏中,用户向用node.js写的服务器发送post请求。 但是,我需要让第一个玩家等待第二个玩家,然后才能提交回复。 现在的问题是,一旦我打电话给我的请求后,我不能发送任何回应的另一个post请求。 看来第一个线程阻止了更多的未来请求。 什么应该使用callback和asynchronous。 如果可能,我不想使用套接字,因为这会限制玩家可以编码的语言。

var newGame=0; //joins new game (username,password) app.post('/game/join', function(req, res) { var username = req.body.username; var password = req.body.password; if(newGame==1){ res.send('Game Started'); newGame=0; } else{ newGame=1; wait(username, function(){ res.send('Game Started'+username); }); } }); function wait(username){ while(newGame==1){ console.log(username + newGame); } } 

Node.js是单线程的,所以你的代码阻止你的服务器处理额外的请求。 阻止事件循环是你不想做的事情。

我正在请求使用像Socket.IO或WebRTC的东西,但我看到你的约束。 我不确定你的意思是“限制语言select者可以编码”

所以你可能会发现,一旦你的等待function开始,没有其他的事情发生。 这是因为具有阻塞调用(console.log)的无限while循环阻止事件循环执行其他任何操作,直到“完成”为止。 您可以使用setTimeout,setInterval和clearInterval来包含等待,以便在将来的某个时间点运行某个函数,分别在一个时间间隔内运行一个函数,并在一个时间间隔内停止运行一个函数。

 var newGame = 0; app.post('/game/join', function(req, res) { var username = req.body.username; var password = req.body.password; if (newGame === 1) { res.send('Game started' + username); } else { var wait = setInterval(function() { if (newGame === 1){ clearInterval(wait); res.send('Game Started'); newGame = 0; } }, 5000); // retry every 5 seconds } } 

});

对我来说,不清楚你如何挑选2个用户来开始比赛。 如果是这样,一个玩家连接,另一个玩家join,然后他们之间开始比赛,我会做这样的事情。

 var waitingResponses = []; //joins new game (username,password) app.post('/game/join', function(req, res) { var username = req.body.username; var password = req.body.password; if(pendingJoinRequests.length) { var waitingPlayerResponse = waitingResponses.shift(); waitingPlayerResponse.send('Game Started'+username); res.send('Game Started'); } else { waitingResponses.push(res); } });