在node / 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>
这是预期的行为。 您的模板引擎正在尝试从您的对象中创build一个string,从而导致[Object object]。 如果你真的想传递这样的数据,我认为你通过string化对象做了正确的事情。
在Node.js中:
res.render('mytemplate', {data: myobject});
在EJS:
<script type='text/javascript'> var rows =<%-JSON.stringify(data)%> </script>
如果您使用的是模板,那么获取模板中的值会更好,例如用户是否login。 您可以使用发送本地数据
<script> window.user = <%- JSON.stringify(user || null) %> </script>
从服务器端代码,您正在发送用户数据。
res.render('profile', { user: user.loggedin, title: "Title of page" });
当把一个对象传给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]可以是'index','home'和'about'的值,子键可以是它的任何子节点,比如'url','path_to_layout','path_to_data'