node.js并表示:如何在URL的基础上加入一个socket.ioroom/channel?

node.js and express: how to join a socket.io room/channel based on URL?

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

我在服务器端使用 node 和 express。我知道如何使用像“/games/:channel”这样的快速路由来解析 URL,但后来我被卡住了。如何将初始 Web 请求与稍后传入的套接字请求联系起来?

如果我使用 PHP,我可以将加入命令直接注入 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('join game','$频道').