如何在页面加载时从节点服务器向javascript客户端发送变量?

时间:2016-06-18 22:19:24

标签: javascript jquery node.js express cookies

我的webapp是99%静态的,除了在页面加载时,我想在他们登录时向客户端发送他们的用户名,如果他们在URL中指定了他们所连接的房间的名称。需要在客户端Javascript中访问这两个变量。所以我一直想弄清楚什么是一项简单的任务,但我运气不好。

  1. 使用模板引擎。

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

    • 问题:导致闪烁,因为首先加载页面然后DOM稍后更新一两次因为必须等待发送和接收请求。它也没有效率,因为它需要第二个请求/响应。
  3. 使用WebSockets

    • 问题:与上述问题相同。
  4. 在页面加载的标题信息中发送

    • 问题:无法访问Javascript中的标头信息,除非您执行的a weird hack仅作为单独的AJAX调用。可以只使用#2。
  5. 所以我最终做的是使用cookie,这是有效的,100%。目前实际上没有任何问题我只是认为代码非常丑陋和脆弱,我正在寻找更好的方法。这是cookie解决方案的代码片段:

    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函数中使用这两个变量。我正在寻找可以让我在一个请求中发送所有内容的替代解决方案,同时避免了很多复杂性和混乱。

1 个答案:

答案 0 :(得分:0)

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

  2. 在html中使用embed js-file,例如<script src='ajax.js'></script>。在这个例子中,ajax.js没有被缓存,包含这样的东西:

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

    它可以动态生成。

  3. 使用cookies。

  4. 顺便说一下,我并不认为使用模板很糟糕。您可以使用javascript模板。它不会成为性能问题,因为模板很快,您只需要执行一个模板。我会使用模板。