Ответ 1
Это ожидаемое поведение. Ваш механизм шаблонов пытается создать строку из вашего объекта, что приводит к [Объекту объекта]. Если вы действительно хотите передавать данные, я думаю, что вы сделали правильную вещь, стягивая объект.
У меня есть довольно большой объект, который мне нужно передать функции в клиенте 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>
Это ожидаемое поведение. Ваш механизм шаблонов пытается создать строку из вашего объекта, что приводит к [Объекту объекта]. Если вы действительно хотите передавать данные, я думаю, что вы сделали правильную вещь, стягивая объект.
В Node.js:
res.render('mytemplate', {data: myobject});
В EJS:
<script type='text/javascript'>
var rows =<%-JSON.stringify(data)%>
</script>
Если вы используете шаблоны, то было бы гораздо лучше получить значения в шаблоне, например, был ли пользователь подписан или нет. Вы можете получить локальные данные отправки, используя
<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 вы можете зацикливать свой объект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"