Pasar un objeto al cliente en node / express + ejs?

Tengo un objeto bastante grande que necesito pasar a una función en un script de cliente. He intentado utilizar JSON.stringify, pero me he encontrado con algunos problemas con este enfoque, principalmente relacionados con el rendimiento. ¿Es posible hacer algo como esto en ejs?

app.get('/load', function(req, res) { var data = { layout:'interview/load', locals: { interview: '', data: someLargeObj } }; res.render('load', data); }); 

Y en mi script de cliente, pasaría este objeto a una función como tal

  load(); // load is a function in a client script  

Cuando pruebo esto consigo cualquiera

  load();  

o

  load([Object object]);  

Ese es el comportamiento esperado. El motor de la plantilla está intentando crear una cadena de su objeto que conduce a [Objeto objeto]. Si realmente quieres pasar datos como ese, creo que hiciste lo correcto al codificar el objeto.

En Node.js:

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

En EJS:

  

NOTA DE SEGURIDAD : No use esto para renderizar un objeto con datos proporcionados por el usuario. Sería posible que alguien como Little Bobby Tables incluyera una subcadena que rompa la cadena JSON e inicie una etiqueta ejecutable o algo así. Por ejemplo, en Node.js esto parece bastante inocente …

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

pero podría dar lugar a que se ejecute una secuencia de comandos proporcionada por el cliente en los navegadores del usuario si ingresan un color como:

 "titanium  oxide" 

Si necesita incluir contenido proporcionado por el usuario, consulte https://stackoverflow.com/a/37920555/645715 para obtener una mejor respuesta usando la encoding Base64

Si está utilizando la creación de plantillas, sería mucho mejor obtener los valores en la plantilla, por ejemplo, si el usuario inició sesión o no. Puede obtener el envío de datos locales usando

  

Desde el código del lado del servidor, está enviando datos de usuario.

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

Piensa que hay una forma mucho mejor al pasar un objeto a los ejs, no tienes que lidiar con los métodos JSON.stringfy y JSON.parse, estos son un poco complicados y confusos. En su lugar, puede usar el ciclo for para recorrer las teclas de sus objetos, por ejemplo:

si tienes un objeto como esa jerarquía

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

En el lado de EJS puedes repetir tu Objeto de esta manera;

 < % if ( locals.yourObject) { %> < % for(key in yourObject) { %> < % if(yourObject.hasOwnProperty(key)) { %>  < % } %> < % } %> < % } %> 

Para este ejemplo, [key] puede tomar los valores ‘index’, ‘home’ y ‘about’ y la subclave puede ser cualquiera de sus elementos secundarios, como ‘url’, ‘path_to_layout’, ‘path_to_data’