【问题标题】:node.js and express: how to join a socket.io room/channel based on URL?node.js 和 express:如何基于 URL 加入 socket.io 房间/频道?
【发布时间】:2015-02-13 15:23:33
【问题描述】:

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

我在服务器端使用节点和快递。我知道如何使用“/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 注入?

【问题讨论】:

    标签: node.js express socket.io


    【解决方案1】:

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

    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','$channel')。

    【讨论】:

    • 谢谢!这几乎正​​是我想要的。
    猜你喜欢
    • 2018-05-24
    • 2014-09-07
    • 2016-09-06
    • 2012-12-08
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 2016-04-26
    相关资源
    最近更新 更多