Определение и использование объекта, переданного из Express в EJS

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