Blog
Apr 2, 2016 - 7 MIN READ
Example Using EJS Templating in Node.js Application

Example Using EJS Templating in Node.js Application

Learn how to use EJS templating in a Node.js application.

Jennifer Bland

Jennifer Bland

EJS, embedded javascript, is a templating language. EJS combines data and a template to produce HTML. One of the most important feature in EJS is the use of partials. Partials allow you to define something once and then apply it to any page in your application.

I will show you how to create a simple Node.js application that uses EJS as the templating engine. Then we will create 2 pages for the website. We will use partials to build out our head, navigation, footer and content.

<!--more-->

File Structure

Here is the file structure for the application we will be creating.


- public
---- style.css
- routes
---- index.js
- views
---- pages
-------- about.ejs
-------- index.ejs
- partials
-------- 3columns.ejs
-------- footer.ejs
-------- head.ejs
-------- nav.ejs
-------- scripts.ejs
- package.json
- server.js

Getting Started

  • express
  • ejs

{
    &quot;name&quot;: &quot;node_ejs_boilerplate&quot;,
    &quot;version&quot;: &quot;1.0.0&quot;,
    &quot;description&quot;: &quot;Boilerplate showing the use of ejs as view template engine in a Node.js application&quot;,
    &quot;author&quot;: &quot;Jennifer Bland&quot;,
    &quot;main&quot;: &quot;server.js&quot;,
    &quot;dependencies&quot;: {
        &quot;ejs&quot;: &quot;^2.4.1&quot;,
        &quot;express&quot;: &quot;^4.13.4&quot;,
        &quot;serve-favicon&quot;: &quot;^2.3.0&quot;
    }
}

npm install express ejs --save

npm install

Server.js


&#39;use strict&#39;;
// ================================================================
// get all the tools we need
// ================================================================
var express = require(&#39;express&#39;);
var routes = require(&#39;./routes/index.js&#39;);
var port = process.env.PORT || 3000;

var app = express();

// ================================================================ // setup our express application // ================================================================ app.use('/public', express.static(process.cwd() + '/public')); app.set('view engine', 'ejs');

// ================================================================ // setup routes // ================================================================ routes(app);

// ================================================================ // start our server // ================================================================ app.listen(port, function() { console.log('Server listening on port ' + port + '...'); });

We define a /public directory because this is how we will reach our stylesheet style.css located in the /public folder.

    We define our templating engine to be ejs.

Routes

    Since I have put the routes in their own folder I need to gain access to them by requiring them in the server.js file.

    We have 2 routes in our application:
    <ul>
  • / - GET to display the home page
  • /about - GET to display the about page
  •     Here is our index.js file in the routes folder:
        <pre class='prettyprint'><xmp>
    

    'use strict';

    module.exports = function(app) { app.get('/', function(req, res) { res.render('pages/index'); });

    app.get('/about', function(req, res) {
        res.render('pages/about');
    });
    

    };

    Configuring our Partials

    • head - contains items found in the head section of a webpage
    • nav - the navigation that will be displayed on every page
    • footer - static footer with link to my website
    • scripts - loading scripts like jQuery and Bootstrap
    • 3columns - content that will be displayed on the homepage
    
    &lt;!-- views/partials/head.ejs --&gt;
    &lt;head&gt;
        &lt;meta charset=&quot;UTF-8&quot;&gt;
        &lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot;&gt;
        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&gt;
        &lt;!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --&gt;
    &lt;title&gt;Demonstration of EJS templating in NodeJS Application&lt;/title&gt;
    
    &lt;!-- STYLESHEETS --&gt;
    &lt;!-- CSS (load bootstrap from a CDN) --&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css&quot;&gt;
    &lt;link rel=&quot;stylesheet&quot; href=&quot;/public/style.css&quot;&gt;
    
    
    &lt;!-- views/partials/nav.ejs --&gt;
    &lt;nav class=&quot;navbar navbar-inverse navbar-fixed-top&quot; role=&quot;navigation&quot;&gt;
        &lt;div class=&quot;container&quot;&gt;
        &lt;div class=&quot;navbar-header&quot;&gt;
            &lt;a class=&quot;navbar-brand&quot; href=&quot;/&quot;&gt;
                &lt;span class=&quot;glyphicon glyphicon glyphicon-cog&quot;&gt;&lt;/span&gt;
                CodePrep.io
            &lt;/a&gt;
        &lt;/div&gt;
    
        &lt;ul class=&quot;nav navbar-nav pull-right&quot;&gt;
            &lt;li&gt;&lt;a href=&quot;/&quot;&gt;Home&lt;/a&gt;&lt;/li&gt;
            &lt;li&gt;&lt;a href=&quot;/about&quot;&gt;About&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
    
    &lt;/div&gt;
    
    
    &lt;!-- views/partials/footer.ejs --&gt;
    &lt;footer class=&quot;footer&quot;&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;p class=&quot;text-center text-muted&quot;&gt;© Copyright 2015 &lt;a href=&quot;http://www.codeprep.io&quot;&gt;CodePrep.io&lt;/a&gt;&lt;/p&gt;
        &lt;/div&gt;
    &lt;/footer&gt;
    
    
    &lt;!-- views/partials/scripts.ejs --&gt;
    
    &lt;!-- jQuery (necessary for Bootstrap&#39;s JavaScript plugins) --&gt;
    &lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js&quot;&gt;&lt;/script&gt;
    &lt;!-- Bootstrap javascript file --&gt;
    &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;
    
    
    &lt;!-- views/partials/3columns.ejs --&gt;
    &lt;section name=&quot;content&quot;&gt;
        &lt;div class=&quot;container&quot;&gt;
            &lt;h2 class=&quot;text-center&quot;&gt;Sample Data&lt;/h2&gt;
            &lt;div class=&quot;col-xs-12 col-md-4&quot;&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum eget iaculis lorem. Fusce elementum magna fringilla ipsum bibendum, vitae consectetur ligula interdum. Sed mauris diam, hendrerit eget suscipit vel, luctus at odio. Etiam pellentesque a metus et pharetra. Praesent dictum, libero id tempor malesuada, erat ex cursus nibh, ac hendrerit massa neque commodo metus. Integer porttitor ante eu varius interdum. Suspendisse quis iaculis erat. Fusce eu nisl id eros tempor posuere. Donec placerat orci orci, ut ultrices neque rutrum in. Nunc dignissim ante et risus rhoncus, vel feugiat mi vestibulum. Aliquam in dictum neque, non vestibulum lorem. Sed imperdiet dolor vitae felis iaculis, id sollicitudin lectus rhoncus. Maecenas ac dolor eget tortor rutrum commodo. Aliquam luctus iaculis mi id semper. Suspendisse sem nisi, convallis at dapibus in, convallis eu neque. Curabitur maximus magna et nulla ullamcorper facilisis.&lt;/p&gt;
            &lt;/div&gt;
            &lt;div class=&quot;col-xs-12 col-md-4&quot;&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum eget iaculis lorem. Fusce elementum magna fringilla ipsum bibendum, vitae consectetur ligula interdum. Sed mauris diam, hendrerit eget suscipit vel, luctus at odio. Etiam pellentesque a metus et pharetra. Praesent dictum, libero id tempor malesuada, erat ex cursus nibh, ac hendrerit massa neque commodo metus. Integer porttitor ante eu varius interdum. Suspendisse quis iaculis erat. Fusce eu nisl id eros tempor posuere. Donec placerat orci orci, ut ultrices neque rutrum in. Nunc dignissim ante et risus rhoncus, vel feugiat mi vestibulum. Aliquam in dictum neque, non vestibulum lorem. Sed imperdiet dolor vitae felis iaculis, id sollicitudin lectus rhoncus. Maecenas ac dolor eget tortor rutrum commodo. Aliquam luctus iaculis mi id semper. Suspendisse sem nisi, convallis at dapibus in, convallis eu neque. Curabitur maximus magna et nulla ullamcorper facilisis.&lt;/p&gt;
            &lt;/div&gt;
            &lt;div class=&quot;col-xs-12 col-md-4&quot;&gt;
                &lt;p&gt;Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum eget iaculis lorem. Fusce elementum magna fringilla ipsum bibendum, vitae consectetur ligula interdum. Sed mauris diam, hendrerit eget suscipit vel, luctus at odio. Etiam pellentesque a metus et pharetra. Praesent dictum, libero id tempor malesuada, erat ex cursus nibh, ac hendrerit massa neque commodo metus. Integer porttitor ante eu varius interdum. Suspendisse quis iaculis erat. Fusce eu nisl id eros tempor posuere. Donec placerat orci orci, ut ultrices neque rutrum in. Nunc dignissim ante et risus rhoncus, vel feugiat mi vestibulum. Aliquam in dictum neque, non vestibulum lorem. Sed imperdiet dolor vitae felis iaculis, id sollicitudin lectus rhoncus. Maecenas ac dolor eget tortor rutrum commodo. Aliquam luctus iaculis mi id semper. Suspendisse sem nisi, convallis at dapibus in, convallis eu neque. Curabitur maximus magna et nulla ullamcorper facilisis.&lt;/p&gt;
            &lt;/div&gt;
        &lt;/div&gt;
    &lt;/section&gt;
    

    Starting our Application

    
    node server.js
    
        If you click on the about link in the navigation, you will see the about page:
        <img class="alignleft size-large wp-image-967" src="/about-1024x516.png" alt="about page" width="600" />