Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pass a Node.js variable to the inside of a Pug script tag?

I am trying to take a variable I've sent to my Pug page from Node.js and place it inside a javascript variable inside of a pug script tag. (Sorry if that is confusing) My node.js code is as follows:

app.get('/profile', function (req, res) {
  var session = req.session;
  res.render('./login.pug', { username: session.uniqueID });
});

When I use the variable in my pug page code like this

input(type='text', id='username', value=username)

it works fine. The value will be changed to the username that the variable holds. But when I try to put the same value in my script tag such as

script.
        var currentuser = username;

the browser console will tell me that username is undefined. How do I properly pass the value of the variable username inside the script tag? Also is there a way to pass the variable username into an external js file as well? Thank you in advance for your help!

like image 640
Paul B. Avatar asked Sep 19 '16 13:09

Paul B.


1 Answers

Normally in pug you can substitute variables like that, but we're in a Plain Text block when we put the period at the end of the script tag and regular variable substitution doesn't work in these blocks:

script.
      ^

In order to output dynamic JavaScript in a Plain Text block we need to use unescaped interpolation to do it with !{...}.

If you are just trying to output a single string value just put quotes around the interpolation tag:

var currentuser = '!{username}';

When you have a more complex JavaScript object you can stringify the variable, and you won't need quotes for this as it's valid JavaScript output.

route:

res.render('test', {
  user: {"name": "Joe Smith"}
});

template:

var currentuser = !{JSON.stringify(user)};

outputs:

<script>var currentuser = {"name":"Joe Smith"};</script>

In case you're curious, the #{...} escaped interpolation inserts invalid characters and looks like this:

template:

var currentuser = #{JSON.stringify(user)};

outputs:

<script>var currentuser = {&quot;name&quot;:&quot;Joe Smith&quot;};</script>
like image 53
Graham Avatar answered Nov 09 '22 20:11

Graham