Javascript 从node.js向客户端js发送数据的最佳方式

Javascript 从node.js向客户端js发送数据的最佳方式,javascript,node.js,express,Javascript,Node.js,Express,从node.js服务器向客户端javascript发送数据(理想情况下是json对象形式)的最佳方式是什么。我已经想到了几个选择,但在我看来没有一个是非常合适的。我要找的是第二种意见或其他建议 让服务器在标记中输出一些代码以设置全局变量 我以前用过这个,但我不喜欢它的想法,主要是因为它有XSS的潜力,我认为这是一种不好的做法,即使发送的数据不是由用户定义的 设置一个包含数据的cookie 这个选项稍微好一点,但由于每次页面加载(至少在我的设置中)数据都可能发生变化,所以它并不适合,因为在我看来,

从node.js服务器向客户端javascript发送数据(理想情况下是json对象形式)的最佳方式是什么。我已经想到了几个选择,但在我看来没有一个是非常合适的。我要找的是第二种意见或其他建议

  • 让服务器在
    标记中输出一些代码以设置全局变量

    我以前用过这个,但我不喜欢它的想法,主要是因为它有XSS的潜力,我认为这是一种不好的做法,即使发送的数据不是由用户定义的

  • 设置一个包含数据的cookie

    这个选项稍微好一点,但由于每次页面加载(至少在我的设置中)数据都可能发生变化,所以它并不适合,因为在我看来,cookies不应该如此不稳定

  • 让客户端javascript在页面加载时向服务器发出ajax请求,以请求json文件

    这同样有效,但会增加很多不必要的开销。每页2个请求似乎不必要

  • 背景:

    我有一个网站,有两个模板:一个是注销用户的索引,另一个是主内容模板

    我的服务器端是基于node.js、express.js、jade等构建的

    我将history.pushState用于所有链接,crossroads.js用于客户端的页面路由。
    我希望能够发送加载的模板和用户id/如果他们登录到客户端javascript,那么它可以相应地处理页面更改。注销的用户可以查看内容页,而无需编辑权限,单击某些链接会将其带回索引模板。

    您可以使用或来实现WebSocket,而不是Ajax(它实现了socket.io。这不仅允许您轻松地在客户端和服务器之间来回传递数据,还允许客户端调用服务器上的函数

    只需将一次性数据包含在
    标记中,类型为“text/template”或“application/json”并确保它们有ID。使用jQuery或标准DOM方法访问它们的内容。对于较短的数据位,您可以在关键元素上使用
    data-*
    属性。

    标记方法很好。如果您担心其他脚本访问数据,那么不要设置全局变量,而是在客户端中编写函数可以接受数据的js代码

    因此,与其生成:

    <script>
      data = { foo : "bar" }
    </script>
    
    
    数据={foo:“bar”}
    
    生成如下内容:

    <script>
      setData({ foo : "bar" });
    </script>
    
    
    setData({foo:bar});
    

    显然,我不认为我需要告诉您,您生成的任何数据都应该由适当的JSON序列化程序序列化,以避免语法错误等。

    一种方法是使用隐藏段落来保存分隔字符串

    我喜欢用不可能嵌入数据元素的字符来分隔字符串

    我最喜欢的分隔符是:

    char delim = (char) 1;  // the SOH character of the ASCII character map
    
    脚本标记不是一个好的选择,因为有太多的分隔符,并且其中一个分隔符很可能嵌入到一个数据元素中

    使用JSON也有同样的问题:分隔符太多

    隐藏的HTML段落元素获得我的投票

    服务器端:

    在带有
    id=“hiddenStrings”style=“visibility:hidden”
    div中放置包含列和值的段落

        p id="delimitedColumnNames"> @Model._ticket.GetDelimitedColumns() /p
        p id="delimitedCoulmnValues"> @Model._ticket.GetDelimitedValues() /p
    
    客户端:

    // The leading character is the delimiter.
    var delimiter = document.getElementById("delimitedColumnNames").innerHTML.substr(0,1);
    var delimited = document.getElementById("delimitedColumnNames").innerHTML.substr(1);
    var ticketCols = delimited.split(delimiter);
    
    var delimiter = document.getElementById("delimitedCoulmnValues").innerHTML.substr(0,1);
    var delimited = document.getElementById("delimitedCoulmnValues").innerHTML.substr(1);
    var ticketValues = delimited.split(delimiter);
    

    我不认为使用套接字进行一次性传输有什么好处。我目前使用的是REST设置,因为我的页面不需要实时更新。最好的方法是将数据输出到脚本标记中,减少1个web请求。我想我会提供其他选择,因为我不知道这是一个单一/简单的请求。我最终还是使用了脚本标记选项。访问js的其他脚本不是问题,因为发送到客户端的内容可能是恶意的。我正在使用
    JSON.stringify(object).replace('/','\/','g')
    使任何XSS都不可能(据我所知)。