35

我有一个非常大的对象,我需要将它传递给客户端脚本中的函数。我曾尝试使用 JSON.stringify,但在使用这种方法时遇到了一些问题——主要与性能有关。可以在 ejs 中做这样的事情吗?

app.get('/load', function(req, res) {
    var data = {
        layout:'interview/load',
        locals: {
            interview: '',
            data: someLargeObj
        }
    };
    res.render('load', data);
});

在我的客户端脚本中,我会将此对象传递给这样的函数

<script type="text/javascript">
    load(<%- data %>); // load is a function in a client script
</script>

当我尝试这个时,我得到

<script type="text/javascript">
    load();
</script>

或者

<script type="text/javascript">
    load([Object object]);
</script>
4

5 回答 5

87

在 Node.js 中:

res.render('mytemplate', {data: myobject});

在 EJS 中:

<script type='text/javascript'>
  var rows =<%-JSON.stringify(data)%>
</script>

安全注意事项:不要使用它来渲染带有用户提供数据的对象。像Little Bobby Tables这样的人可能会包含一个子字符串,它会破坏 JSON 字符串并启动一个可执行标签或类似的东西。例如,在 Node.js 中,这看起来很无辜......

var data = {"color": client.favorite_color}

但如果用户输入以下颜色,可能会导致客户端提供的脚本在用户的浏览器中执行:

"titanium </script><script>alert('pwnd!')</script> oxide"

如果您需要包含用户提供的内容,请参阅https://stackoverflow.com/a/37920555/645715以获得使用 Base64 编码的更好答案

于 2013-08-07T14:54:16.857 回答
15

这是预期的行为。您的模板引擎正在尝试从您的对象创建一个字符串,该字符串导致 [Object object]。如果你真的想传递这样的数据,我认为你通过字符串化对象做了正确的事情。

于 2012-06-22T07:18:02.443 回答
5

如果您正在使用模板,那么获取模板中的值会更好,例如用户是否登录。您可以使用以下方式获取发送本地数据

<script>
    window.user = <%- JSON.stringify(user || null) %>
</script>

从服务器端代码,您正在发送用户数据。

res.render('profile', {
    user: user.loggedin,
    title: "Title of page"
});
于 2017-12-06T15:46:31.943 回答
1

认为将对象传递给 ejs 时有更好的方法,您不必处理 JSON.stringfy 和 JSON.parse 方法,这些方法有点棘手和混乱。相反,您可以使用 for in 循环来遍历对象的键,例如:

如果你有一个像这样的层次结构的对象

{
    "index": {
        "url": "/",
        "path_to_layout": "views/index.ejs",
        "path_to_data": [
            "data/global.json",
            {
                "data/meta.json": "default"
            }
        ]
    },
    "home": {
        "url": "/home",
        "path_to_layout": "views/home/index.ejs",
        "path_to_data": [
            "data/global.json",
            {
                "data/meta.json": "home"
            }
        ]
    },
    "about": {
        "url": "/about",
        "path_to_layout": "views/default.ejs",
        "path_to_data": [
            "data/global.json",
            {
                "data/meta.json": "about"
            }
        ]
    }
}

在 EJS 方面,您可以像这样循环 yourObject;

<% if ( locals.yourObject) { %>
  <% for(key in yourObject) { %>
    <% if(yourObject.hasOwnProperty(key)) { %>
      <div> <a class="pagelist" href="<%= yourObject[key]['subkey'] %>"><%= key %></a></div>
    <% } %>
  <% } %>
<% } %>

对于此示例,[key] 可以采用 'index'、'home' 和 'about' 值,并且 subkey 可以是它的任何子项,例如 'url'、'path_to_layout'、'path_to_data'

于 2014-11-10T08:46:30.290 回答
-3

你得到的是这样的结果 [{'re': 'tg'}]

你实际上需要循环它。请参阅 javascript while 循环 https://www.w3schools.com/js/js_loop_while.asp

然后,用 ejs 在你的前端渲染它......我无能为力,我使用 hbs

于 2018-09-12T04:58:14.523 回答