node.js和express:如何基于URL加入socket.io房间/频道



我有一个相当简单的棋盘游戏应用程序,使用socket.io来同步玩家之间的移动。目前,客户端被引导到一个登录页面,在那里他们可以创建一个新游戏,其名称可以成为socket.io房间的标识符,也可以加入现有游戏。这一切都很好,但我想向游戏创作者提供一个URL,发送给他们的朋友,绕过登录,直接带他们进入游戏,比如http://myttgame.com/games/MyAwesomeGame。

我在服务器端使用node和express。我知道如何使用"/games/:channel"这样的快速路径解析URL,但后来我就陷入了困境。如何将初始web请求与稍后传入的套接字请求绑定?

如果我使用PHP,我可以像一样将join命令直接注入html页面

<body> ...
  <script>
  <?php
    if($channel)
      echo "socket.emit('join game','$channel');";
    else
      echo "showLoginForm();";
  ?>
  </script>
</body>

有没有一种正确的方法来处理这种类型的事情,使用express,或者如果没有,使用一些粗糙的变通方法,比如php注入?

基本上您想要处理两个不同的请求。类似的东西:

app.get('/games/:channel', function(req, res) {
        res.render('board.ejs')
        // do emit and rest stuff
    });
app.get('/games', isLoggedIn, function(req, res) {
        res.render('createboard.ejs')
        // do emit and rest stuff
    });
function isLoggedIn(req, res, next) {
    if (req.isAuthenticated())
        return next();
    res.redirect('/login');
    //or
    res.render('login.ejs');
}

没有通道的url会将他重定向到登录页面,或者在他没有登录的情况下呈现登录页面。Board.ejs在初始化期间可以执行socket.emit("加入游戏","$channel")。

最新更新