Displaying Dynamic Data with PugJS

nkratzmeyer

Nathan Kratzmeyer

Posted on August 24, 2019

Displaying Dynamic Data with PugJS

This post is the third in a short series on using the PugJS view engine with NodeJS and ExpressJS. In the last part, we covered using PugJS to create shared HTML layouts. In this post, we'll cover passing data from the express server into a Pug page. Let's get started!

Starting Code

Below is the code as it was at the end of the last post.

//   index.js
const express = require("express");

const app = express();

app.set("view engine", "pug");

app.get("/", (req, res) => {
  res.render("index");
});

app.get("/about", (req, res) => {
  res.render("about");
});

app.listen(3000, () => {
  console.log("Server listening on 3000");
});
Enter fullscreen mode Exit fullscreen mode
//- main-layout.pug
<!DOCTYPE html>
html(lang="en")
    head
        title Home Page
    body
        header
            nav
                ul
                    li
                        a(href="/") Home
                    li
                        a(href="/about") About
        h1 This h1 is from the layout.
        hr
        block content
        section
            h2 This h2 is also from the layout
        block more_content
Enter fullscreen mode Exit fullscreen mode
//- Index.pug
extends layouts/main-layout.pug
block content
    p This content is from index.pug!
block more_content
    p More content from index.pug!!
Enter fullscreen mode Exit fullscreen mode
//- about.pug
extends layouts/main-layout.pug
block content
    p This content is from about.pug!
    p About my cool site!
Enter fullscreen mode Exit fullscreen mode

And here is our folder layout

project_folder
>node_modules
--Lots of stuff
>views
>>layouts
---main-layout.pug
--about.pug
--index.pug
-index.js
-package-lock.json
-package.json
Enter fullscreen mode Exit fullscreen mode

Adding Some Data

Let's put some dummy data into our server so that we have something to pass into our Pug pages. Open index.js and insert the following just before our app declaration.

const userNames = ["Sean", "George", "Roger", "Timothy", "Pierce", "Daniel"];
const bestMovie = "Casino Royale";
const licensedToKill = true;
Enter fullscreen mode Exit fullscreen mode

Now let's pass this data into our rendered pages. On the home route handler, modify the res.render code to the following.

res.render("index", {
  userNames,
  bestMovie,
  licensedToKill
});
Enter fullscreen mode Exit fullscreen mode

Here we are passing an object to the view engine. This method of passing data to the engine seems to be standard across the major view engines. The passed object's properties will be available inside the Pug template as we'll see next.

Displaying Data

Let's start by just displaying bestMovie on the home page. Open index.pug and modify the more_content block to match the below code:

block more_content
    p The best movie is #{ bestMovie }
    p= bestMovie
Enter fullscreen mode Exit fullscreen mode

Now check out the home route to see the results. The first paragraph element shows how we can perform interpolation in our content. The second paragraph demonstrates how we can set the text content of an element without interpolation.

Conditional Logic

Now let's look at integrating a little conditional logic in our Pug page. In index.pug, modify the content block to match the following:

block content
    if licensedToKill
        p Bond is licensed to kill!
    else
        p Bond is NOT licensed to kill!
Enter fullscreen mode Exit fullscreen mode

Try switching the value of licensedToKill in index.js and see how it changes the page rendering. Pug gives us a nice clean way to perform conditional rendering based on passed in data.

Looping

Now let's check out how we can iterate over our array of user names. This time let's work in main-layout.pug just to show that we can use dynamic data in our layout files. Under our existing h2, add the following (the ul should be indented to the same level as the h2):

ul
    for user in userNames
        li= user
Enter fullscreen mode Exit fullscreen mode

Once again, the syntax for looping over an array is very concise.
NOTE: At this point, if you go to the about page, you will receive an error on the page as we haven't passed in any data on that route, but the main-layout.pug page is looking for a userNames array. As an exercise, modify the route handler to pass in the necessary data.

Conclusion

In this post I've gone over using PugJS to render data received from the server. We've seen how to display simple data, how to use interpolation, conditional logic, and looping with PugJS. Hopefully this post and series was useful and informative to anyone looking at PugJS as a view engine. As always, corrections/comments/critiques are welcome!

💖 💪 🙅 🚩
nkratzmeyer
Nathan Kratzmeyer

Posted on August 24, 2019

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Shared HTML Layouts With Pugjs
pugjs Shared HTML Layouts With Pugjs

August 22, 2019