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