Passing objects to client in node + express + jade?

27,500

You can't inline a JS object like that, but you can JSON.stringify it before:

<script type="text/javascript">
  var data = !{JSON.stringify(data)};
</script>
Share:
27,500
killermonkeys
Author by

killermonkeys

Updated on July 09, 2022

Comments

  • killermonkeys
    killermonkeys almost 2 years

    I have a pretty heavyweight query on the server that results in a new page render, and I'd like to pass along some of the results of the query to the client (as a javascript array of objects). This is basically so I don't have to do a separate JSON query later to get the same content (which is mostly static). The data will be useful eventually, but not initially so I didn't put it directly into the document.

    app.get('/expensiveCall', function(req, res) {
        // do expensive call
        var data = veryExpensiveFunction();
        res.render('expensiveCall.jade', {
            locals: {
                    data: data,
                    }
            });
        });
    });
    

    data is a array of objects and only some are initially used. I'd like to pass either the entirety of data over or some subsets (depending on the situation). My jade looks like normal jade, but I would like to include something like

    <script type="text/javascript">
    var data = #{data};
    </script>
    

    but this doesn't work (it's an array of objects).

  • killermonkeys
    killermonkeys over 12 years
    Sorry should have said that earlier: jade escapes all emitted content which means I'd also have to unescape it, and it's not clear how to turn off escaping. I think there is some way to do with within express, but I'm not sure how. I may just switch to a different template engine but it means forking code :-(.
  • Adrien
    Adrien over 12 years
    If you use !{} instead of #{} the escaping should be turned off.
  • killermonkeys
    killermonkeys over 12 years
    ack! I didn't catch that, makes sense. Thanks!
  • Jeremy Knees
    Jeremy Knees over 9 years
    Is this good practice or am I missing another way of passing json to client?
  • user1736947
    user1736947 about 9 years
    Will the value of the variable get updated if the view is re-rendered.
  • Crazy Redd
    Crazy Redd over 7 years
    @Adrien +1 for being helpful, however your code will render the stringified JSON straight into the JavaScript causing a syntax error. You easily resolve this by encasing the !{} with quotes.
  • haotang
    haotang over 6 years
    Thanks you for nice solution