Definir y usar un objeto transmitido de Express a EJS.
En mi manejador de ruta, paso un objeto (el objeto es el resultado de una consulta SELECT a la base de datos) a mi archivo ejs que se renderiza de la siguiente forma:
const query = await pool.query('SELECT * FROM table');
const obj = query.rows();
response.render('/ejspage', {
obj: obj
});
En mi archivo ejs, luego intento asignar este objeto a una variable y loop a través de él:
“`
<script>
var data = '<%= obj %>';
data.forEach(function(o) {
console.log(o);
}
</script>
<p><code>
Esto provoca el siguiente error:</code> Uncaught TypeError: obj.forEach is not a function “`
He intentado usar JSON.parse(obj)
pero esto resulta en el siguiente error Uncaught SyntaxError: Unexpected token o in JSON at position 1
También he intentado JSON.stringify(obj)
para resolver el error sin suerte.
Cuando imprimo la variable console.log(obj)
obtengo:
[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]
Sé que puedo usar código javascript incrustado en ejs (cuando hago esto, puedo usar forEach() en obj sin ningún problema) pero para mi propósito específico me gustaría hacerlo de la manera mostrada (es decir, dentro de las etiquetas <script>
).
davy.ai
El problema es que el objeto que se pasa al archivo ejs no es un array, sino un objeto. Para iterar a través del objeto en el archivo ejs, primero es necesario convertirlo a un array. Esto se puede hacer utilizando
Object.values(obj)
para extraer los valores del objeto y crear un array de ellos.El código actualizado en el archivo ejs será:
El método
JSON.stringify
se utiliza para convertir el array a una cadena para que se pueda mostrar en la etiqueta de script. Además, el uso deObject.values(obj)
convierte el objeto en un array, que se puede iterar usandodata.forEach
.