2

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

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

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

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

    这个选项稍微好一点,但由于每次页面加载时数据可能会发生变化(至少在我的设置中),它并不真正适合,因为在我看来,cookie 不应该是这种易变的。

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

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

背景:

我有一个带有 2 个模板的站点:注销用户的索引和主要内容模板。

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

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

4

4 回答 4

1

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

于 2012-10-31T23:10:36.500 回答
1

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

因此,而不是生成:

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

生成这样的东西:

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

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

于 2012-11-01T02:13:17.863 回答
0

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

于 2012-10-31T19:24:59.710 回答
0

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

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

我最喜欢的分隔符是:

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

脚本标记不是一个好的选择,因为分隔符太多,并且其中一个分隔符很可能嵌入到您的数据元素之一中。

使用 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);
于 2020-04-28T19:07:22.417 回答