在node / express + ejs中将对象传递给客户端?

时间:2012-06-22 07:08:47

标签: node.js express ejs

我有一个非常大的对象需要传递给客户端脚本中的函数。我尝试过使用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>

5 个答案:

答案 0 :(得分:64)

在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编码的更好答案

答案 1 :(得分:10)

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

答案 2 :(得分:1)

如果您正在使用模板,那么获取模板中的值会更好,例如用户是否已登录。您可以使用

获取发送本地数据
<script>
    window.user = <%- JSON.stringify(user || null) %>
</script>

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

res.render('profile', {
    user: user.loggedin,
    title: "Title of page"
});

答案 3 :(得分:0)

您所拥有的是这样的结果     [{'re':'tg'}]

您实际上需要循环它。请参见JavaScript while循环https://www.w3schools.com/js/js_loop_while.asp

然后,用ejs渲染到您的前端...我对此无能为力,我使用hbs

答案 4 :(得分:-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方面,你可以像这样循环你的对象;

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

对于此示例[key]可以采用&#39; index&#39;,&#39; home&#39;和&#39;关于&#39;值和子键可以是其中任何一个子项,例如&#39; url&#39;,&#39; path_to_layout&#39;,&#39; path_to_data&#39;