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

时间:2012-10-31 19:18:09

标签: javascript node.js express

将一些数据(理想情况下以json对象的形式)从node.js服务器发送到客户端的javascript的最佳方法是什么。我想过几个选项,但在我看来,它们似乎都不合适。我正在寻找第二种意见或其他一些建议。

  1. 让服务器在<script>标记中输出一些代码来设置全局变量。

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

  2. 设置一个包含其中数据的cookie。

    这个选项好一点,但由于数据可能会因每次页面加载而改变(至少在我的设置中),因此在我看来,cookie并不适合易失性

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

    这也有效,但它增加了许多不必要的开销。每页2个请求似乎没必要。

  4. 背景

    我有一个包含2个模板的网站:已注销用户的索引和主要内容模板。

    我的服务器端是由node.js,express.js,jade等构建的。

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

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

所以不要生成:

<script>
  data = { foo : "bar" }
</script>

生成如下内容:

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

一种方法是使用隐藏的段落来保存定界的字符串。

我想用无法将其嵌入数据元素中的字符来分隔字符串。

我最喜欢的定界符是:

char delim = (char) 1;  // the SOH character of the ASCII character map

script标记不是一个好选择,因为定界符太多,并且很可能将其中一个定界符嵌入到您的一个数据元素中。

使用JSON存在相同的问题:定界符过多。

一个隐藏的HTML段落元素赢得了我的投票。

服务器端:

div内的id="hiddenStrings" style="visibility:hidden"内放置包含列和值的段落

    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);