繁体   English   中英

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

[英]Passing an object to client in 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>

在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编码的更好答案

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

如果使用模板,则最好在模板中获取值,例如,是否登录用户。 您可以使用以下方式获取发送本地数据

<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端,您可以像这样循环yourObject;

<% 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”

您所拥有的是这样的结果[{'re':'tg'}]

您实际上需要循环它。 请参阅javascript while循环https://www.w3schools.com/js/js_loop_while.asp

然后,用ejs在您的前端呈现它...我对此无能为力,我使用hbs

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM