Передача объекта клиенту в node/express + ejs?

У меня есть довольно большой объект, который мне нужно передать функции в клиенте script. Я попытался использовать JSON.stringify, но столкнулся с несколькими проблемами с этим подходом - в основном, с точки зрения производительности. Возможно ли сделать что-то подобное в ejs?

app.get('/load', function(req, res) {
    var data = {
        layout:'interview/load',
        locals: {
            interview: '',
            data: someLargeObj
        }
    };
    res.render('load', data);
});

И в моем клиенте script я передал бы этот объект такой функции, как

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

Ответы

Ответ 1

Это ожидаемое поведение. Ваш механизм шаблонов пытается создать строку из вашего объекта, что приводит к [Объекту объекта]. Если вы действительно хотите передавать данные, я думаю, что вы сделали правильную вещь, стягивая объект.

Ответ 2

В Node.js:

res.render('mytemplate', {data: myobject});

В EJS:

<script type='text/javascript'>
  var rows =<%-JSON.stringify(data)%>
</script>

Ответ 3

Если вы используете шаблоны, то было бы гораздо лучше получить значения в шаблоне, например, был ли пользователь подписан или нет. Вы можете получить локальные данные отправки, используя

<script>
    window.user = <%- JSON.stringify(user || null) %>
</script>

Из кода на стороне сервера вы отправляете пользовательские данные.

res.render('profile', {
    user: user.loggedin,
    title: "Title of page"
});

Ответ 4

Подумайте, куда лучше передать объект 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 вы можете зацикливать свой объектObject следующим образом:

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