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编码的更好答案
Pic*_*els 12
这是预期的行为.您的模板引擎正在尝试从您的对象创建一个字符串,该字符串将指向[Object object].如果你真的想传递这样的数据,我认为你通过对对象进行字符串化来做正确的事情.
如果您正在使用模板,那么获取模板中的值会更好,例如用户是否登录。您可以使用
<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)