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

Err*_*ald 27 ejs node.js express

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

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

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

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

当我尝试这个时,我得到了

<script type="text/javascript">
    load();
</script>
Run Code Online (Sandbox Code Playgroud)

要么

<script type="text/javascript">
    load([Object object]);
</script>
Run Code Online (Sandbox Code Playgroud)

pro*_*ype 71

在Node.js中:

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

在EJS中:

<script type='text/javascript'>
  var rows =<%-JSON.stringify(data)%>
</script>
Run Code Online (Sandbox Code Playgroud)

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

var data = {"color": client.favorite_color}
Run Code Online (Sandbox Code Playgroud)

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

"titanium </script><script>alert('pwnd!')</script> oxide"
Run Code Online (Sandbox Code Playgroud)

如果您需要包含用户提供的内容,请参阅/sf/answers/2654438881/以获得使用Base64编码的更好答案

  • `<%= x%>`直接插入x的值,`<% - x%>`也是HTML-escape它,所以像`<`和`>`这样的字符不会被HTML解析器吃掉. (13认同)
  • 你能告诉我`<% - `和`<%=`之间的区别吗?为什么没有`;`到底? (3认同)
  • @Vishal-Lia Node 有活动对象,但 html 页面是文本。如果不进行字符串化,该对象将呈现为“[Object]”。使用 stringify 允许 html 页面将对象表示为浏览器可以解析回活动对象的东西。 (2认同)

Pic*_*els 12

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

  • `JSON.stringify(someLargeObj)` (2认同)

Piy*_*tel 5

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

<script>
    window.user = <%- JSON.stringify(user || null) %>
</script>
Run Code Online (Sandbox Code Playgroud)

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

res.render('profile', {
    user: user.loggedin,
    title: "Title of page"
});
Run Code Online (Sandbox Code Playgroud)