Передача объекта клиенту в 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>
 Florian Margaine22 июн. 2012 г., 09:54
JSON.stringify это единственный способ.
 Vishal-Lia13 мая 2018 г., 15:28
@FlorianMargaine, не могли бы вы рассказать, почему использовать «JSON.stringify ()»? на стороне клиента? так как узел будет передавать данные в виде формы объекта, а stringify просто преобразует их в строку, вместо этого нам нужен объект, верно? Это не работает без JSON.stringify ()

Ответы на вопрос(5)

В Node.js:

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

В EJS:

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

SECURITY NOTE : Не используйте это для визуализации объекта с предоставленными пользователем данными. Это было бы возможно для кого-то вродеМаленькие Бобби Столы включить подстроку, которая разрывает строку JSON и запускает исполняемый тег или что-то подобное. Например, в Node.js это выглядит довольно невинно ...

var data = {"color": client.favorite_color}

но может привести к выполнению клиентского сценария в пользовательских браузерах, если они введут цвет, такой как:

"titanium </script><script>alert('pwnd!')</script> oxide"

Если вам нужно включить предоставленный пользователем контент, см.https://stackoverflow.com/a/37920555/645715 для лучшего ответа используя кодировку Base64

 06 окт. 2015 г., 10:38
Это должен быть правильный ответ
 04 апр. 2015 г., 02:44
<%= x %> интерполирует значение х напрямую и<%-x%> также HTML-экранирует его, поэтому такие символы, как< а также> не быть съеденным парсером HTML.
 20 апр. 2017 г., 13:59
@ Prototype, крутой братан !!! спас мой день !!! ^ _ ^ идеальный ответ, пытался уйти от HTML долгое время ...
 03 апр. 2015 г., 17:56
Не могли бы вы сказать мне разницу между<%- а также<%=? А почему нет; в конце?
 04 апр. 2015 г., 02:45
В терминале Javascript точки с запятой необязательны, но, вероятно, лучше включить их.
Решение Вопроса

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

 22 июн. 2012 г., 09:55
JSON.stringify(someLargeObj)

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

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

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

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

То, что у вас есть, это результат, как это     [{'re' ':' tg '}]

Вы действительно должны зациклить это. Смотрите JavaScript в то время как циклhttps://www.w3schools.com/js/js_loop_while.asp

Затем сделайте рендеринг в вашем интерфейсе с помощью ejs ... я не могу помочь, я использую hbs

Подумайте, что при передаче объекта в ejs существует гораздо лучший способ, вам не нужно иметь дело с методами JSON.stringfy и JSON.parse, это немного сложно и запутанно. Вместо этого вы можете использовать цикл for для перемещения ключей ваших объектов, например:

если у вас есть объект, подобный такой иерархии

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

В этом примере [ключ] может принимать «индекс», «дом». и "о"; значениями и подразделами могут быть любые его дочерние элементы, такие как «url», «path_to_layout», «path_to_data»;

Ваш ответ на вопрос