2016-06-18 12 views
0

我的web应用程序是99%静态的,除了在页面加载时,如果他们已经登录,我想向客户端发送他们的用户名和他们连接到的房间的名称(如果他们在URL中指定的话)。这两个变量需要在客户端Javascript中访问。所以我一直在试图弄清楚什么感觉像一个简单的任务,但我运气不大。如何在页面加载时从节点服务器向JavaScript客户端发送变量?

  1. 使用模板引擎。

    • 问题:矫枉过正,因为我只需要一个/两个变量原本静态的页面上,我需要访问它在JavaScript中,而不是HTML
  2. 让页面后一个AJAX请求负载

    • 问题:导致闪烁,因为首先在页面加载,然后DOM更新一两秒钟后,因为要等待要发送和接收的请求。而且它效率不高,因为它需要第二个请求/响应。
  3. 使用WebSockets

    • 问题:上面那个问题一样。
  4. 发送它的头信息在页面加载

    • 问题:除非你做a weird hack这只能作为一个单独的AJAX调用无法访问在Javascript头信息。可以使用#2。

所以我结束了用饼干做这个工作的,100%。目前实际上没有任何问题,我只是认为代码非常丑陋而且很脆弱,我正在寻找更好的方法。这是一个什么样的饼干解决方案看起来像一个片段:

app.get('/room/:roomName', function(req, res) { 
    res.clearCookie('room'); 

    if (req.isAuthenticated()) { 
     res.cookie('username', req.user.username); 
    } else { 
     res.cookie('username', ''); 
    } 

    var roomName = req.params.roomName; 

    if (roomNameToRoom.hasOwnProperty(roomName)) { 
     res.cookie('room', req.params.roomName); 
    } 

    res.sendFile(path.join(__dirname, '../public/index.html')); 
}); 

正如你可以看到我抓住从请求的用户名和验证的房间,如果它是有效的,我发送回来。然后我在客户端使用RegEx解析cookie(非常混乱),并在JavaScript函数中使用这两个变量。我正在寻找其他解决方案,这将允许我在一个请求中发送这一切,同时避免复杂性和混乱。

回答

0
  1. 重定向到特殊的URL,例如index.htm?var1=5&var2=6并在JS中使用location.search.substr(1).split('&')

  2. 在html中使用嵌入js-file,例如<script src='ajax.js'></script>。在这个例子中,ajax.js没有被缓存,并且包含如下内容:

    window.var1 = 5; 
    window.var2 = 6; 
    

    它可以动态生成。

  3. 使用cookie。

顺便说一句,我不认为使用模板是不好的。您可以使用JavaScript模板。它不应该是性能问题,因为模板速度很快,而且您只需要执行一个模板。我会使用模板。

+0

你会推荐哪种模板?我发现的那些HTML代码太复杂了,不适合我。尽管我倾向于#6。我能否在服务器端不使用文件的情况下使用#6?就像在服务器上假装JSON对象是客户端上的'ajax.js'。 –

+0

我不会建议一些确切的模板,但你可以创建node.js服务器,它使用指定扩展名的文件(如php解释器)。 #6你可以随心所欲地做。 – vitaliydev

相关问题