我一直在构建一个Web套接字应用程序,其中客户端打开游戏实例的链接,然后服务器尝试将客户端连接到游戏将传输信息的相应Socket.io房间。例如,连接到' / game / abc'将加载游戏页面并将页面上的套接字连接到' abc'服务器上的房间。
这样做的问题是让客户端JavaScript文件发出游戏ID和用户连接的用户名。我希望它以下列方式行事:
Client.js
var socket = io();
socket.emit("newUser", username, gameID);
我设法通过Express.html模板渲染器传递client.html和client.js页面来实现此目的:
Server.js
app.get(/^\/game\/([a-zA-Z0-9]*)$/, function(req, res){
var game = req.params[0];
var user = req.session.name; //gets username stored in session
res.render("client.html", {username: user, gameName: game});
});
app.get(/game\/(.*)\/client.js/, function(req,res){
res.render("client.js", {username: req.session.name, gameName: req.params[0]});
});
第二个app.get()允许gameName以url中参数的形式通过client.html传递给client.js。
Client.html
<script src="{{gameName}}/client.js"></script>
最后两次传递后,模板引擎将游戏ID和用户名都放入client.js。
Client.js
var socket = io();
socket.emit("newUser", "{{username}}", "{{gameName}}");
//leads to socket.emit("newUser", "user", "abc"); when passed through renderer
虽然这可以完成工作,但感觉令人难以置信的复杂和间接。我已经找到了替代方案,node.js express rendering inside included js files的答案建议使用AJAX调用。但是,我还没有弄清楚如何准确配置这样的AJAX调用。有没有更有效的方法来克服这个问题?
答案 0 :(得分:0)
您可以简化所有这些操作,并避免在Express中渲染模板以传递该变量。
您已在window.location
对象中的客户端代码中使用了已授予的名称。您可以使用简单的正则表达式手动解析(在本例中),也可以使用名为客户端路由器的内容,这些内容有很多可供选择。
有一个受Express.js启发的简单客户端路由器:Page.js,它允许您使用您在Express中使用的非常相似的代码。
许多客户端框架都内置了路由器。