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