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