[英]Node.js Express: Passing data from URL and session into served JavaScript file
我一直在构建一个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表达内部包含js文件,建议使用AJAX调用。 但是,我还没有弄清楚如何准确配置这样的AJAX调用。 有没有更有效的方法来克服这个问题?
您可以简化所有这些操作,并避免在Express中渲染模板以传递该变量。
您已经在window.location
对象中为您的客户端代码提供了给出的名称。 您可以使用简单的正则表达式手动解析它(在这种情况下),或者您可以使用一些称为客户端路由器的东西 ,有很多可供选择。
有一个受Express.js启发的简单客户端路由器: Page.js ,它允许您使用Express中现在使用的非常相似的代码。
许多客户端框架都内置了路由器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.