Passer un objet au client dans node / express + ejs?

j'ai un objet assez grand que je dois passer à une fonction dans un script client. J'ai essayé D'utiliser JSON.stringify, mais ont rencontré quelques problèmes avec cette approche - pour la plupart liées à la performance. Est-il possible de faire quelque chose comme ça dans les SEJ?

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

Et dans mon script, j'aimerais passer cet objet à une fonction comme

<script type="text/javascript">
    load(<%- data %>); // load is a function in a client script
</script>

Quand j'ai essayer ce que j'obtiens

<script type="text/javascript">
    load();
</script>

ou

<script type="text/javascript">
    load([Object object]);
</script>
21
demandé sur Errol Fitzgerald 2012-06-22 11:08:47

5 réponses

C'est le comportement attendu. Votre moteur de template essaye de créer une chaîne à partir de votre objet qui mène à [Object object]. Si vous voulez vraiment passer des données comme ça, je pense que vous avez fait la bonne chose en stringifying l'objet.

9
répondu Pickels 2012-06-22 07:18:02

Dans Le Noeud.js:

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

In EJS:

<script type='text/javascript'>
  var rows =<%-JSON.stringify(data)%>
</script>

NOTE DE SÉCURITÉ: ne pas utiliser ceci pour rendre un objet avec des données fournies par l'utilisateur. Il serait possible pour quelqu'un comme Peu De Bobby Tables pour inclure une chaîne qui casse la chaîne JSON et démarre une balise exécutable ou quelque chose comme ça. Par exemple, dans le Nœud.js cela semble assez innocent...

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

mais pourrait avoir pour résultat un script fourni par le client exécuté dans les navigateurs de l'utilisateur s'ils entrent une couleur telle que:

"titanium </script><script>alert('pwnd!')</script> oxide"

Si vous avez besoin d'inclure des contenus, veuillez consulter https://stackoverflow.com/a/37920555/645715 pour une meilleure réponse à l'aide de l'encodage Base64

57
répondu prototype 2018-08-17 02:53:28

Si vous utilisez les templates, alors il serait beaucoup mieux pour obtenir les valeurs dans le modèle, par exemple si l'utilisateur est connecté ou non. Vous pouvez obtenir les données d'envoi local en utilisant

<script>
    window.user = <%- JSON.stringify(user || null) %>
</script>

à partir du code côté serveur, vous envoyez des données utilisateur.

res.render('profile', {
    user: user.loggedin,
    title: "Title of page"
});
1
répondu Piyush P 2017-12-06 15:46:31

ce que vous avez est un résultat comme ceci [{'re': 'tg'}]

vous devez en fait le boucler. Voir boucle javascript en boucle https://www.w3schools.com/js/js_loop_while.asp

alors, rendez-le à votre extrémité avant avec des EJ... je ne peux pas aider sur ce, j'utilise hbs

0
répondu Mimigirl 2018-09-12 04:58:14

pensez qu'il y a une bien meilleure façon de passer un objet aux EJ , vous n'avez pas à traiter avec JSON.stringfy et JSON.méthodes d'analyse, ce sont un peu délicat et déroutant. A la place, vous pouvez utiliser la boucle for in pour déplacer les touches de vos objets, par exemple:

si vous avez un objet comme tel hiérarchie

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

du côté des EJ, vous pouvez boucler votre objet comme ceci;

<% if ( locals.yourObject) { %>
  <% for(key in yourObject) { %>
    <% if(yourObject.hasOwnProperty(key)) { %>
      <div> <a class="pagelist" href="<%= yourObject[key]['subkey'] %>"><%= key %></a></div>
    <% } %>
  <% } %>
<% } %>

Pour cet exemple [key] peut prendre 'index','home' et 'sur' les valeurs et les sous-clés peuvent être n'importe lequel de ses enfants tels que 'url','path_to_layout','path_to_data'

-1
répondu btargac 2014-11-10 08:46:30