在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'