我有一个相当简单的棋盘游戏应用程序,使用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")。