#javascript #express #ejs
Вопрос:
В моем обработчике маршрута я передаю объект (объект является результатом запроса SELECT к базе данных) в мой файл ejs, который отображается следующим образом:
const query = await pool.query('SELECT * FROM table'); const obj = query.rows(); response.render('/ejspage', { obj: obj });
В моем файле ejs я затем пытаюсь присвоить этот объект переменной и просмотреть его:
lt;scriptgt; var data = 'lt;%= obj %gt;'; data.forEach(function(o) { console.log(o); } lt;/scriptgt;
Это приводит к следующей ошибке: Uncaught TypeError: obj.forEach is not a function
Я пробовал использовать JSON.parse(obj)
, но это приводит к следующей ошибке Uncaught SyntaxError: Unexpected token o in JSON at position 1
Я также пытался JSON.stringify(obj)
устранить ошибку, но безуспешно
Когда я распечатываю переменную console.log(obj)
, я получаю:
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Я знаю, что могу использовать встроенный javascript в ejs (когда я это делаю, я могу использовать forEach() для obj просто отлично), но для моей конкретной цели я хотел бы сделать это так, как показано (т. Е. в lt;scriptgt;
тегах).
Ответ №1:
вам нужно использовать и JSON.stringify
то, и другое, и JSON.parse
lt;scriptgt; var data = JSON.parse('lt;%= JSON.stringify(obj) %gt;'); data.forEach(function(o) { console.log(o); } lt;/scriptgt;
я обнаружил, что в некоторых случаях это JSON parse
JSON stringify
по-прежнему приводило к ошибкам, и вдохновился сообщением, в котором анализировались файлы cookie
lt;scriptgt; var data = JSON.parse(decodeURIComponent('lt;%=encodeURIComponent( JSON.stringify(data) ) %gt;')) data.forEach(function(o) { console.log(o); } lt;/scriptgt;
альтернативой является использование res.cookie
, но оно ограничено 4 МБ
Комментарии:
1. Разве не используют
JSON.parse
иJSON.stringify
просто отрицают друг друга? Другим решением, которое я нашел, было сделать следующее: var data = lt;%- JSON.stringify(obj)%gt;;, что затем позволяет мне перебирать obj с помощью .forEach()2. для кода внутри lt;% %gt; выполняется на стороне сервера , в основном lt;% %gt;
JSON.stringify
преобразует объект в строку и добавляет на html-страницу, отправляемую клиенту, а затем, когда браузер загружает страницу, он преобразует строку в объект (используяJSON.parse
)